Skip to content

Commit b4827da

Browse files
authored
[Python/EC2] Add pipeline exporter for custom metrics testing (#473)
1 parent fb173f2 commit b4827da

File tree

3 files changed

+108
-2
lines changed

3 files changed

+108
-2
lines changed

sample-apps/python/django_frontend_service/frontend_service_app/views.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,47 @@
1313
from django.http import HttpResponse, JsonResponse
1414
from opentelemetry import trace, metrics
1515
from opentelemetry.trace.span import format_trace_id
16+
from opentelemetry.sdk.resources import Resource
17+
from opentelemetry.sdk.metrics import MeterProvider
18+
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
19+
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
20+
from opentelemetry.semconv.resource import ResourceAttributes
1621

1722
logger = logging.getLogger(__name__)
1823

24+
# Custom export pipeline - runs alongside existing CWAgent & ADOT setup
25+
pipeline_resource = Resource.create({
26+
"service.name": os.environ['SERVICE_NAME'],
27+
"deployment.environment.name": os.environ['DEPLOYMENT_ENVIRONMENT_NAME']
28+
})
29+
30+
pipeline_metric_exporter = OTLPMetricExporter(
31+
endpoint="localhost:4317"
32+
)
33+
34+
pipeline_metric_reader = PeriodicExportingMetricReader(
35+
exporter=pipeline_metric_exporter,
36+
export_interval_millis=1000
37+
)
38+
39+
pipeline_meter_provider = MeterProvider(
40+
resource=pipeline_resource,
41+
metric_readers=[pipeline_metric_reader]
42+
)
43+
44+
pipeline_meter = pipeline_meter_provider.get_meter("myMeter")
45+
46+
1947
#python equivalent of Meter meter = GlobalOpenTelemetry.getMeter("myMeter"); for custom metrics
2048
meter = metrics.get_meter("myMeter")
2149
agent_based_counter = meter.create_counter("agent_based_counter", unit="1", description="agent export counter")
2250
agent_based_histogram = meter.create_histogram("agent_based_histogram", description="agent export histogram")
2351
agent_based_gauge = meter.create_up_down_counter("agent_based_gauge", unit="1", description="agent export gauge")
2452

53+
custom_pipeline_counter = pipeline_meter.create_counter("custom_pipeline_counter", unit="1", description="pipeline export counter")
54+
custom_pipeline_histogram = pipeline_meter.create_histogram("custom_pipeline_histogram", description="pipeline export histogram")
55+
custom_pipeline_gauge = pipeline_meter.create_up_down_counter("custom_pipeline_gauge", unit="1", description="pipeline export gauge")
56+
2557

2658
should_send_local_root_client_call = False
2759
lock = threading.Lock()
@@ -63,6 +95,10 @@ def aws_sdk_call(request):
6395
agent_based_histogram.record(random.randint(100, 1000), {"Operation": "histogram"})
6496
agent_based_gauge.add(random.randint(-10, 10), {"Operation": "gauge"})
6597

98+
custom_pipeline_counter.add(1, {"Operation": "pipeline_counter"})
99+
custom_pipeline_histogram.record(random.randint(100, 1000), {"Operation": "pipeline_histogram"})
100+
custom_pipeline_gauge.add(random.randint(-10, 10), {"Operation": "pipeline_gauge"})
101+
66102
bucket_name = "e2e-test-bucket-name"
67103

68104
# Add a unique test ID to bucketname to associate buckets to specific test runs

terraform/python/ec2/default/main.tf

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,10 @@ resource "null_resource" "main_service_setup" {
179179
export OTEL_EXPORTER_OTLP_METRICS_PROTOCOL=grpc
180180
export OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=localhost:4317
181181
export OTEL_EXPORTER_OTLP_METRICS_INSECURE=true
182+
export SERVICE_NAME='python-sample-application-${var.test_id}'
183+
export DEPLOYMENT_ENVIRONMENT_NAME='ec2:default'
182184
export OTEL_TRACES_SAMPLER=always_on
183-
export OTEL_RESOURCE_ATTRIBUTES="service.name=python-sample-application-${var.test_id},deployment.environment.name=ec2:default"
185+
export OTEL_RESOURCE_ATTRIBUTES="service.name=$${SERVICE_NAME},deployment.environment.name=$${DEPLOYMENT_ENVIRONMENT_NAME}"
184186
export AWS_REGION='${var.aws_region}'
185187
python${var.language_version} manage.py migrate
186188
nohup opentelemetry-instrument python${var.language_version} manage.py runserver 0.0.0.0:8000 --noreload &

validator/src/main/resources/expected-data-template/python/ec2/default/aws-otel-custom-metrics.mustache

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,4 +156,72 @@
156156
value: ANY_VALUE
157157
-
158158
name: cloud.platform
159-
value: aws_ec2
159+
value: aws_ec2
160+
161+
# Export pipeline metrics
162+
-
163+
metricName: custom_pipeline_counter
164+
namespace: {{metricNamespace}}
165+
dimensions:
166+
-
167+
name: deployment.environment.name
168+
value: ec2:default
169+
-
170+
name: service.name
171+
value: {{serviceName}}
172+
-
173+
name: Operation
174+
value: pipeline_counter
175+
-
176+
name: telemetry.sdk.name
177+
value: opentelemetry
178+
-
179+
name: telemetry.sdk.language
180+
value: python
181+
-
182+
name: telemetry.sdk.version
183+
value: ANY_VALUE
184+
-
185+
metricName: custom_pipeline_histogram
186+
namespace: {{metricNamespace}}
187+
dimensions:
188+
-
189+
name: deployment.environment.name
190+
value: ec2:default
191+
-
192+
name: service.name
193+
value: {{serviceName}}
194+
-
195+
name: Operation
196+
value: pipeline_histogram
197+
-
198+
name: telemetry.sdk.name
199+
value: opentelemetry
200+
-
201+
name: telemetry.sdk.language
202+
value: python
203+
-
204+
name: telemetry.sdk.version
205+
value: ANY_VALUE
206+
-
207+
metricName: custom_pipeline_gauge
208+
namespace: {{metricNamespace}}
209+
dimensions:
210+
-
211+
name: deployment.environment.name
212+
value: ec2:default
213+
-
214+
name: service.name
215+
value: {{serviceName}}
216+
-
217+
name: Operation
218+
value: pipeline_gauge
219+
-
220+
name: telemetry.sdk.name
221+
value: opentelemetry
222+
-
223+
name: telemetry.sdk.language
224+
value: python
225+
-
226+
name: telemetry.sdk.version
227+
value: ANY_VALUE

0 commit comments

Comments
 (0)