Skip to content

Commit 6514f37

Browse files
author
Azfaar Qureshi
authored
Prometheus Remote Write Exporter (5/6) (#216)
1 parent ae70d5a commit 6514f37

File tree

5 files changed

+243
-14
lines changed

5 files changed

+243
-14
lines changed

CHANGELOG.md

+12-11
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
- `opentelemetry-sdk-extension-aws` Add method to return fields injected by propagator
1313
([#226](https://github.com/open-telemetry/opentelemetry-python/pull/226))
1414
- `opentelemetry-exporter-prometheus-remote-write` Prometheus Remote Write Exporter Setup
15-
((#180)[https://github.com/open-telemetry/opentelemetry-python-contrib/pull/180])
16-
- `opentelemetry-exporter-prometheus-remote-write` Add Exporter constructor validation methods
17-
((#206)[https://github.com/open-telemetry/opentelemetry-python-contrib/pull/206])
18-
- `opentelemetry-exporter-prometheus-remote-write` Add conversion to TimeSeries methods
19-
((#207)[https://github.com/open-telemetry/opentelemetry-python-contrib/pull/207])
20-
- `opentelemetry-exporter-prometheus-remote-write` Add request methods
21-
((#212)[https://github.com/open-telemetry/opentelemetry-python-contrib/pull/212])
15+
([#180](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/180))
16+
- `opentelemetry-exporter-prometheus-remote-write` Add Exporter constructor validation methods in Prometheus Remote Write Exporter
17+
([#206](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/206))
18+
- `opentelemetry-exporter-prometheus-remote-write` Add conversion to TimeSeries methods in Prometheus Remote Write Exporter
19+
([#207](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/207))
20+
- `opentelemetry-exporter-prometheus-remote-write` Add request methods to Prometheus Remote Write Exporter
21+
([#212](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/212))
2222
- `opentelemetry-instrumentation-fastapi` Added support for excluding some routes with env var `OTEL_PYTHON_FASTAPI_EXCLUDED_URLS`
2323
([#237](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/237))
2424
- `opentelemetry-instrumentation-starlette` Added support for excluding some routes with env var `OTEL_PYTHON_STARLETTE_EXCLUDED_URLS`
2525
([#237](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/237))
26-
26+
- Add Prometheus Remote Write Exporter integration tests in opentelemetry-docker-tests
27+
([#216](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/216))
2728

2829
### Changed
2930
- `opentelemetry-instrumentation-asgi`, `opentelemetry-instrumentation-wsgi` Return `None` for `CarrierGetter` if key not found
@@ -92,7 +93,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9293
([#1239](https://github.com/open-telemetry/opentelemetry-python/pull/1239))
9394
- `opentelemetry-instrumentation-django` Bugfix use request.path replace request.get_full_path(). It will get correct span name
9495
([#1309](https://github.com/open-telemetry/opentelemetry-python/pull/1309#))
95-
- `opentelemetry-instrumentation-django` Record span status and http.status_code attribute on exception
96+
- `opentelemetry-instrumentation-django` Record span status and http.status_code attribute on exception
9697
([#1257](https://github.com/open-telemetry/opentelemetry-python/pull/1257))
9798
- `opentelemetry-instrumentation-grpc` Rewrite gRPC server interceptor
9899
([#1171](https://github.com/open-telemetry/opentelemetry-python/pull/1171))
@@ -120,7 +121,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
120121
- `opentelemetry-instrumentation-pymysql` Bumped version from 0.9.3 to 0.10.1
121122
([#1228](https://github.com/open-telemetry/opentelemetry-python/pull/1228))
122123
- `opentelemetry-instrumentation-django` Changed span name extraction from request to comply semantic convention
123-
([#992](https://github.com/open-telemetry/opentelemetry-python/pull/992))
124+
([#992](https://github.com/open-telemetry/opentelemetry-python/pull/992))
124125

125126
## [0.13b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.13b0) - 2020-09-17
126127

@@ -264,7 +265,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
264265
## [0.8b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.8.0) - 2020-05-27
265266

266267
### Added
267-
- `opentelemetry-ext-datadog` Add exporter to Datadog
268+
- `opentelemetry-ext-datadog` Add exporter to Datadog
268269
([#572](https://github.com/open-telemetry/opentelemetry-python/pull/572))
269270
- `opentelemetry-ext-sqlite3` Initial release
270271
- `opentelemetry-ext-psycopg2` Implement instrumentor interface, enabling auto-instrumentation

tests/opentelemetry-docker-tests/tests/docker-compose.yml

+8
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,11 @@ services:
3939
- "16686:16686"
4040
- "14268:14268"
4141
- "9411:9411"
42+
cortex:
43+
image: quay.io/cortexproject/cortex:v1.5.0
44+
command:
45+
- -config.file=./config/cortex-config.yml
46+
volumes:
47+
- ./prometheus-remote-write-cortex/cortex-config.yml:/config/cortex-config.yml:ro
48+
ports:
49+
- 9009:9009
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# This Cortex Config is copied from the Cortex Project documentation
2+
# Source: https://github.com/cortexproject/cortex/blob/master/docs/configuration/single-process-config.yaml
3+
4+
# Configuration for running Cortex in single-process mode.
5+
# This configuration should not be used in production.
6+
# It is only for getting started and development.
7+
8+
# Disable the requirement that every request to Cortex has a
9+
# X-Scope-OrgID header. `fake` will be substituted in instead.
10+
auth_enabled: false
11+
12+
server:
13+
http_listen_port: 9009
14+
15+
# Configure the server to allow messages up to 100MB.
16+
grpc_server_max_recv_msg_size: 104857600
17+
grpc_server_max_send_msg_size: 104857600
18+
grpc_server_max_concurrent_streams: 1000
19+
20+
distributor:
21+
shard_by_all_labels: true
22+
pool:
23+
health_check_ingesters: true
24+
25+
ingester_client:
26+
grpc_client_config:
27+
# Configure the client to allow messages up to 100MB.
28+
max_recv_msg_size: 104857600
29+
max_send_msg_size: 104857600
30+
use_gzip_compression: true
31+
32+
ingester:
33+
# We want our ingesters to flush chunks at the same time to optimise
34+
# deduplication opportunities.
35+
spread_flushes: true
36+
chunk_age_jitter: 0
37+
38+
walconfig:
39+
wal_enabled: true
40+
recover_from_wal: true
41+
wal_dir: /tmp/cortex/wal
42+
43+
lifecycler:
44+
# The address to advertise for this ingester. Will be autodiscovered by
45+
# looking up address on eth0 or en0; can be specified if this fails.
46+
# address: 127.0.0.1
47+
48+
# We want to start immediately and flush on shutdown.
49+
join_after: 0
50+
min_ready_duration: 0s
51+
final_sleep: 0s
52+
num_tokens: 512
53+
tokens_file_path: /tmp/cortex/wal/tokens
54+
55+
# Use an in memory ring store, so we don't need to launch a Consul.
56+
ring:
57+
kvstore:
58+
store: inmemory
59+
replication_factor: 1
60+
61+
# Use local storage - BoltDB for the index, and the filesystem
62+
# for the chunks.
63+
schema:
64+
configs:
65+
- from: 2019-07-29
66+
store: boltdb
67+
object_store: filesystem
68+
schema: v10
69+
index:
70+
prefix: index_
71+
period: 1w
72+
73+
storage:
74+
boltdb:
75+
directory: /tmp/cortex/index
76+
77+
filesystem:
78+
directory: /tmp/cortex/chunks
79+
80+
delete_store:
81+
store: boltdb
82+
83+
purger:
84+
object_store_type: filesystem
85+
86+
frontend_worker:
87+
# Configure the frontend worker in the querier to match worker count
88+
# to max_concurrent on the queriers.
89+
match_max_concurrent: true
90+
91+
# Configure the ruler to scan the /tmp/cortex/rules directory for prometheus
92+
# rules: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/#recording-rules
93+
ruler:
94+
enable_api: true
95+
enable_sharding: false
96+
storage:
97+
type: local
98+
local:
99+
directory: /tmp/cortex/rules
100+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# Copyright The OpenTelemetry Authors
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
from opentelemetry import metrics
16+
from opentelemetry.exporter.prometheus_remote_write import (
17+
PrometheusRemoteWriteMetricsExporter,
18+
)
19+
from opentelemetry.test.test_base import TestBase
20+
21+
22+
def observer_callback(observer):
23+
array = [1.0, 15.0, 25.0, 26.0]
24+
for (index, usage) in enumerate(array):
25+
labels = {"test_label": str(index)}
26+
observer.observe(usage, labels)
27+
28+
29+
class TestPrometheusRemoteWriteExporterCortex(TestBase):
30+
def setUp(self):
31+
super().setUp
32+
self.exporter = PrometheusRemoteWriteMetricsExporter(
33+
endpoint="http://localhost:9009/api/prom/push",
34+
headers={"X-Scope-Org-ID": "5"},
35+
)
36+
self.labels = {"environment": "testing"}
37+
self.meter = self.meter_provider.get_meter(__name__)
38+
metrics.get_meter_provider().start_pipeline(
39+
self.meter, self.exporter, 1,
40+
)
41+
42+
def test_export_counter(self):
43+
try:
44+
requests_counter = self.meter.create_counter(
45+
name="counter",
46+
description="test_export_counter",
47+
unit="1",
48+
value_type=int,
49+
)
50+
requests_counter.add(25, self.labels)
51+
except Exception as e:
52+
self.fail(
53+
"Export counter failed with unexpected error {}".format(e)
54+
)
55+
56+
def test_export_valuerecorder(self):
57+
try:
58+
requests_size = self.meter.create_valuerecorder(
59+
name="valuerecorder",
60+
description="test_export_valuerecorder",
61+
unit="1",
62+
value_type=int,
63+
)
64+
requests_size.record(25, self.labels)
65+
except Exception as e:
66+
self.fail(
67+
"Export valuerecorder failed with unexpected error {}".format(
68+
e
69+
)
70+
)
71+
72+
def test_export_updowncounter(self):
73+
try:
74+
requests_size = self.meter.create_updowncounter(
75+
name="updowncounter",
76+
description="test_export_updowncounter",
77+
unit="1",
78+
value_type=int,
79+
)
80+
requests_size.add(-25, self.labels)
81+
except Exception as e:
82+
self.fail(
83+
"Export updowncounter failed with unexpected error {}".format(
84+
e
85+
)
86+
)
87+
88+
def test_export_sumobserver(self):
89+
try:
90+
self.meter.register_sumobserver(
91+
callback=observer_callback,
92+
name="sumobserver",
93+
description="test_export_sumobserver",
94+
unit="1",
95+
value_type=float,
96+
)
97+
except Exception as e:
98+
self.fail(
99+
"Export sumobserver failed with unexpected error {}".format(e)
100+
)
101+
102+
def test_export_updownsumobserver(self):
103+
try:
104+
self.meter.register_updownsumobserver(
105+
callback=observer_callback,
106+
name="updownsumobserver",
107+
description="test_export_updownsumobserver",
108+
unit="1",
109+
value_type=float,
110+
)
111+
except Exception as e:
112+
self.fail(
113+
"Export updownsumobserver failed with unexpected error {}".format(
114+
e
115+
)
116+
)

tox.ini

+7-3
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ commands_pre =
198198
test: pip install {toxinidir}/opentelemetry-python-core/opentelemetry-api {toxinidir}/opentelemetry-python-core/opentelemetry-sdk {toxinidir}/opentelemetry-python-core/tests/util
199199

200200
test: pip install {toxinidir}/opentelemetry-python-core/opentelemetry-instrumentation
201-
201+
202202
celery: pip install {toxinidir}/instrumentation/opentelemetry-instrumentation-celery[test]
203203

204204
grpc: pip install {toxinidir}/instrumentation/opentelemetry-instrumentation-grpc[test]
@@ -341,7 +341,8 @@ deps =
341341
sqlalchemy ~= 1.3.16
342342
redis ~= 3.3.11
343343
celery ~= 4.0, != 4.4.4
344-
344+
protobuf>=3.13.0
345+
requests==2.25.0
345346
changedir =
346347
tests/opentelemetry-docker-tests/tests
347348

@@ -361,7 +362,10 @@ commands_pre =
361362
-e {toxinidir}/instrumentation/opentelemetry-instrumentation-aiopg \
362363
-e {toxinidir}/instrumentation/opentelemetry-instrumentation-redis \
363364
-e {toxinidir}/instrumentation/opentelemetry-instrumentation-system-metrics \
364-
-e {toxinidir}/opentelemetry-python-core/exporter/opentelemetry-exporter-opencensus
365+
-e {toxinidir}/opentelemetry-python-core/exporter/opentelemetry-exporter-opencensus \
366+
-e {toxinidir}/exporter/opentelemetry-exporter-prometheus-remote-write
367+
sudo apt-get install libsnappy-dev
368+
pip install python-snappy
365369
docker-compose up -d
366370
python check_availability.py
367371
commands =

0 commit comments

Comments
 (0)