Skip to content
This repository was archived by the owner on Nov 16, 2023. It is now read-only.

Commit 7f892e8

Browse files
authored
Merge pull request #104 from lzchen/v0.4b.x
2 parents 9eb0a82 + eb00c0f commit 7f892e8

37 files changed

+1417
-593
lines changed

README.md

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ The online documentation is available at https://opentelemetry-azure-monitor-pyt
1818

1919
### Trace
2020

21-
The **Azure Monitor Trace Exporter** allows you to export [OpenTelemetry](https://opentelemetry.io/) traces to [Azure Monitor](https://docs.microsoft.com/azure/azure-monitor/).
21+
The **Azure Monitor Span Exporter** allows you to export [OpenTelemetry](https://opentelemetry.io/) traces to [Azure Monitor](https://docs.microsoft.com/azure/azure-monitor/).
2222

2323
This example shows how to send a span "hello" to Azure Monitor.
2424

@@ -33,17 +33,13 @@ from opentelemetry.sdk.trace import TracerProvider
3333
from opentelemetry.sdk.trace.export import BatchExportSpanProcessor
3434

3535
trace.set_tracer_provider(TracerProvider())
36-
37-
# We tell OpenTelemetry who it is that is creating spans. In this case, we have
38-
# no real name (no setup.py), so we make one up. If we had a version, we would
39-
# also specify it here.
4036
tracer = trace.get_tracer(__name__)
4137

38+
# SpanExporter receives the spans and send them to the target location
4239
exporter = AzureMonitorSpanExporter(
4340
connection_string='InstrumentationKey=<your-ikey-here>',
4441
)
4542

46-
# SpanExporter receives the spans and send them to the target location.
4743
span_processor = BatchExportSpanProcessor(exporter)
4844
trace.get_tracer_provider().add_span_processor(span_processor)
4945

@@ -75,12 +71,14 @@ trace.set_tracer_provider(TracerProvider())
7571
tracer_provider = trace.get_tracer_provider()
7672

7773
exporter = AzureMonitorSpanExporter(
78-
connection_string='InstrumentationKey=<your-ikey-here>',
79-
)
74+
connection_string='InstrumentationKey=<your-ikey-here>',
75+
)
8076
span_processor = BatchExportSpanProcessor(exporter)
8177
tracer_provider.add_span_processor(span_processor)
8278

8379
RequestsInstrumentor().instrument()
80+
81+
# This request will be traced
8482
response = requests.get(url="https://azure.microsoft.com/")
8583
```
8684

@@ -106,6 +104,7 @@ def callback_function(envelope):
106104
exporter = AzureMonitorSpanExporter(
107105
connection_string='InstrumentationKey=<your-ikey-here>'
108106
)
107+
# This line will modify telemetry
109108
exporter.add_telemetry_processor(callback_function)
110109

111110
trace.set_tracer_provider(TracerProvider())

azure_monitor/CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@
22

33
## Unreleased
44

5+
## 0.4b.0
6+
Released 2020-06-29
7+
8+
- Added live metrics
9+
([#96](https://github.com/microsoft/opentelemetry-azure-monitor-python/pull/96))
10+
- Remove dependency metrics from auto-collection
11+
([#99](https://github.com/microsoft/opentelemetry-azure-monitor-python/pull/99))
12+
- Change default local storage directory
13+
([#100](https://github.com/microsoft/opentelemetry-azure-monitor-python/pull/100))
14+
- Implement proxies in exporter configuration
15+
([#101](https://github.com/microsoft/opentelemetry-azure-monitor-python/pull/101))
16+
- Remove request failed per second metrics from auto-collection
17+
([#102](https://github.com/microsoft/opentelemetry-azure-monitor-python/pull/102))
18+
519
## 0.3b.1
620
Released 2020-05-21
721

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,34 @@
11
# Copyright (c) Microsoft Corporation. All rights reserved.
22
# Licensed under the MIT License.
3-
from opentelemetry import metrics
3+
from opentelemetry import metrics, trace
44
from opentelemetry.sdk.metrics import MeterProvider
5-
from opentelemetry.sdk.metrics.export.controller import PushController
5+
from opentelemetry.sdk.trace import TracerProvider
66

77
from azure_monitor import AzureMonitorMetricsExporter
8-
from azure_monitor.sdk.auto_collection import AutoCollection
8+
from azure_monitor.sdk.auto_collection import (
9+
AutoCollection,
10+
AzureMetricsSpanProcessor,
11+
)
12+
13+
# Add Span Processor to get metrics about traces
14+
trace.set_tracer_provider(TracerProvider())
15+
tracer = trace.get_tracer_provider().get_tracer(__name__)
16+
span_processor = AzureMetricsSpanProcessor()
17+
trace.get_tracer_provider().add_span_processor(span_processor)
918

1019
metrics.set_meter_provider(MeterProvider())
1120
meter = metrics.get_meter(__name__)
1221
exporter = AzureMonitorMetricsExporter(
1322
connection_string="InstrumentationKey=<INSTRUMENTATION KEY HERE>"
1423
)
15-
controller = PushController(meter, exporter, 5)
1624

1725
testing_label_set = {"environment": "testing"}
1826

1927
# Automatically collect standard metrics
20-
auto_collection = AutoCollection(meter=meter, labels=testing_label_set)
28+
auto_collection = AutoCollection(
29+
meter=meter, labels=testing_label_set, span_processor=span_processor
30+
)
2131

22-
# To configure a separate export interval specific for standard metrics
23-
# meter_standard = metrics.get_meter(__name__ + "_standard")
24-
# controller _standard = PushController(meter_standard, exporter, 30)
25-
# _auto_collection = AutoCollection(meter=meter_standard, label_set=testing_label_set)
32+
metrics.get_meter_provider().start_pipeline(meter, exporter, 2)
2633

2734
input("Press any key to exit...")

azure_monitor/examples/metrics/observer.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
# Licensed under the MIT License.
33
import psutil
44
from opentelemetry import metrics
5-
from opentelemetry.sdk.metrics import MeterProvider
6-
from opentelemetry.sdk.metrics.export.controller import PushController
5+
from opentelemetry.sdk.metrics import MeterProvider, UpDownSumObserver
76

87
from azure_monitor import AzureMonitorMetricsExporter
98

@@ -12,7 +11,7 @@
1211
exporter = AzureMonitorMetricsExporter(
1312
connection_string="InstrumentationKey=<INSTRUMENTATION KEY HERE>"
1413
)
15-
controller = PushController(meter=meter, exporter=exporter, interval=2)
14+
metrics.get_meter_provider().start_pipeline(meter, exporter, 2)
1615

1716

1817
# Callback to gather cpu usage
@@ -28,6 +27,7 @@ def get_cpu_usage_callback(observer):
2827
description="per-cpu usage",
2928
unit="1",
3029
value_type=float,
30+
observer_type=UpDownSumObserver,
3131
label_keys=("cpu_number",),
3232
)
3333

@@ -44,6 +44,7 @@ def get_ram_usage_callback(observer):
4444
description="RAM memory usage",
4545
unit="1",
4646
value_type=float,
47+
observer_type=UpDownSumObserver,
4748
label_keys=(),
4849
)
4950

azure_monitor/examples/metrics/simple.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# Licensed under the MIT License.
33
from opentelemetry import metrics
44
from opentelemetry.sdk.metrics import Counter, MeterProvider
5-
from opentelemetry.sdk.metrics.export.controller import PushController
65

76
from azure_monitor import AzureMonitorMetricsExporter
87

@@ -11,7 +10,7 @@
1110
exporter = AzureMonitorMetricsExporter(
1211
connection_string="InstrumentationKey=<INSTRUMENTATION KEY HERE>"
1312
)
14-
controller = PushController(meter, exporter, 5)
13+
metrics.get_meter_provider().start_pipeline(meter, exporter, 5)
1514

1615
requests_counter = meter.create_metric(
1716
name="requests",

azure_monitor/setup.cfg

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@ classifiers =
2020
Programming Language :: Python :: 3.5
2121
Programming Language :: Python :: 3.6
2222
Programming Language :: Python :: 3.7
23+
Programming Language :: Python :: 3.8
2324

2425
[options]
2526
python_requires = >=3.4
2627
package_dir=
2728
=src
2829
packages=find_namespace:
2930
install_requires =
30-
opentelemetry-api ~= 0.7b1
31-
opentelemetry-sdk ~= 0.7b1
31+
opentelemetry-api == 0.10b0
32+
opentelemetry-sdk == 0.10b0
3233
psutil >= 5.6.3
3334
requests ~= 2.0
3435

azure_monitor/src/azure_monitor/export/__init__.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@
44
import logging
55
import typing
66
from enum import Enum
7+
from urllib.parse import urlparse
78

89
import requests
910
from opentelemetry.sdk.metrics.export import MetricsExportResult
1011
from opentelemetry.sdk.trace.export import SpanExportResult
12+
from opentelemetry.sdk.util import ns_to_iso_str
13+
from opentelemetry.trace import Span, SpanKind
14+
from opentelemetry.trace.status import StatusCanonicalCode
1115

16+
from azure_monitor import protocol, utils
1217
from azure_monitor.options import ExporterOptions
1318
from azure_monitor.protocol import Envelope
1419
from azure_monitor.storage import LocalFileStorage
@@ -90,15 +95,16 @@ def _transmit_from_storage(self) -> None:
9095
# give a few more seconds for blob lease operation
9196
# to reduce the chance of race (for perf consideration)
9297
if blob.lease(self.options.timeout + 5):
93-
envelopes = blob.get() # TODO: handle error
98+
envelopes = blob.get()
9499
result = self._transmit(envelopes)
95100
if result == ExportResult.FAILED_RETRYABLE:
96101
blob.lease(1)
97102
else:
98-
blob.delete(silent=True)
103+
blob.delete()
99104

100105
# pylint: disable=too-many-branches
101106
# pylint: disable=too-many-nested-blocks
107+
# pylint: disable=too-many-return-statements
102108
def _transmit(self, envelopes: typing.List[Envelope]) -> ExportResult:
103109
"""
104110
Transmit the data envelopes to the ingestion service.
@@ -116,9 +122,18 @@ def _transmit(self, envelopes: typing.List[Envelope]) -> ExportResult:
116122
"Content-Type": "application/json; charset=utf-8",
117123
},
118124
timeout=self.options.timeout,
125+
proxies=self.options.proxies,
119126
)
127+
except requests.Timeout:
128+
logger.warning(
129+
"Request time out. Ingestion may be backed up. Retrying."
130+
)
131+
return ExportResult.FAILED_RETRYABLE
120132
except Exception as ex:
121-
logger.warning("Transient client side error: %s.", ex)
133+
logger.warning(
134+
"Retrying due to transient client side error %s.", ex
135+
)
136+
# client side error (retryable)
122137
return ExportResult.FAILED_RETRYABLE
123138

124139
text = "N/A"

azure_monitor/src/azure_monitor/export/metrics/__init__.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,14 @@
55
from typing import Sequence
66
from urllib.parse import urlparse
77

8-
from opentelemetry.sdk.metrics import Counter, Metric, Observer
8+
from opentelemetry.sdk.metrics import (
9+
Counter,
10+
SumObserver,
11+
UpDownCounter,
12+
UpDownSumObserver,
13+
ValueObserver,
14+
ValueRecorder,
15+
)
916
from opentelemetry.sdk.metrics.export import (
1017
MetricRecord,
1118
MetricsExporter,
@@ -66,20 +73,22 @@ def _metric_to_envelope(
6673
)
6774
envelope.name = "Microsoft.ApplicationInsights.Metric"
6875
value = 0
69-
metric = metric_record.metric
70-
if isinstance(metric, Counter):
71-
value = metric_record.aggregator.checkpoint
72-
elif isinstance(metric, Observer):
76+
metric = metric_record.instrument
77+
if isinstance(metric, ValueObserver):
78+
# mmscl
7379
value = metric_record.aggregator.checkpoint.last
74-
if not value:
75-
value = 0
80+
elif isinstance(metric, ValueRecorder):
81+
# mmsc
82+
value = metric_record.aggregator.checkpoint.count
7683
else:
77-
# TODO: What do measure aggregations look like in AI?
78-
logger.warning("Measure metric recorded.")
79-
84+
# sum or lv
85+
value = metric_record.aggregator.checkpoint
86+
if value is None:
87+
logger.warning("Value is none. Default to 0.")
88+
value = 0
8089
data_point = protocol.DataPoint(
81-
ns=metric_record.metric.description,
82-
name=metric_record.metric.name,
90+
ns=metric.description,
91+
name=metric.name,
8392
value=value,
8493
kind=protocol.DataPointType.MEASUREMENT.value,
8594
)

0 commit comments

Comments
 (0)