Skip to content

Commit bbef9bc

Browse files
authored
Update doc examples to include metrics (#217)
1 parent 3f342f0 commit bbef9bc

File tree

11 files changed

+187
-77
lines changed

11 files changed

+187
-77
lines changed

docs-requirements.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
-c dev-constraints.txt
22
Sphinx
33
sphinx-autodoc-typehints
4-
# unpin these entirely once the metrics SDK is available in a new version
5-
opentelemetry-api==1.10a0
6-
opentelemetry-sdk==1.10a0
74
-e ./opentelemetry-exporter-gcp-trace
85
-e ./opentelemetry-exporter-gcp-monitoring
96
-e ./opentelemetry-propagator-gcp

docs/examples/cloud_monitoring/README.rst

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Viewing Output
3131

3232
After running the example:
3333
* Go to the `Cloud Monitoring Metrics Explorer page <https://console.cloud.google.com/monitoring/metrics-explorer>`_.
34-
* In "Find resource type and metric" enter "OpenTelemetry/request_counter".
34+
* In "Select a Metric" enter "workload.googleapis.com/request_counter".
3535
* You can filter by labels and change the graphical output here as well.
3636

3737
Troubleshooting
@@ -40,9 +40,9 @@ Troubleshooting
4040
``One or more points were written more frequently than the maximum sampling period configured for the metric``
4141
##############################################################################################################
4242

43-
Currently, Cloud Monitoring allows one write every 10 seconds for any unique tuple (metric_name, metric_label_value_1, metric_label_value_2, ...). The exporter should rate limit on its own but issues arise if:
43+
Currently, Cloud Monitoring allows one write every 5 seconds for any unique tuple (metric_name, metric_label_value_1, metric_label_value_2, ...). The exporter should rate limit on its own but issues arise if:
4444

45-
* You are restarting the server more than once every 10 seconds.
45+
* You are restarting the server more than once every 5 seconds.
4646
* You have a multiple exporters (possibly on different threads) writing to the same tuple.
4747

48-
For both cases, you can pass ``add_unique_identifier=True`` to the CloudMonitoringMetricsExporter constructor. This adds a UUID label_value, making the tuple unique again. For the first case, you can also choose to just wait longer than 10 seconds between restarts.
48+
For both cases, you can pass ``add_unique_identifier=True`` to the CloudMonitoringMetricsExporter constructor. This adds a UUID label_value, making the tuple unique again. For the first case, you can also choose to just wait longer than 5 seconds between restarts.

docs/examples/cloud_monitoring/basic_metrics.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,36 @@
2020
CloudMonitoringMetricsExporter,
2121
)
2222
from opentelemetry.sdk.metrics import MeterProvider
23+
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
24+
from opentelemetry.sdk.resources import Resource
2325

24-
metrics.set_meter_provider(MeterProvider())
25-
meter = metrics.get_meter(__name__)
26-
metrics.get_meter_provider().start_pipeline(
27-
meter, CloudMonitoringMetricsExporter(), 5
26+
metrics.set_meter_provider(
27+
MeterProvider(
28+
metric_readers=[
29+
PeriodicExportingMetricReader(
30+
CloudMonitoringMetricsExporter(), export_interval_millis=5000
31+
)
32+
],
33+
resource=Resource.create(
34+
{
35+
"service.name": "basic_metrics",
36+
"service.namespace": "examples",
37+
"service.instance.id": "instance123",
38+
}
39+
),
40+
)
2841
)
42+
meter = metrics.get_meter(__name__)
2943

44+
# Creates metric workload.googleapis.com/request_counter with monitored resource generic_task
3045
requests_counter = meter.create_counter(
3146
name="request_counter",
3247
description="number of requests",
3348
unit="1",
34-
value_type=int,
3549
)
3650

3751
staging_labels = {"environment": "staging"}
3852

3953
for i in range(20):
4054
requests_counter.add(25, staging_labels)
41-
time.sleep(10)
55+
time.sleep(5)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
cachetools==5.2.0
2+
certifi==2022.9.24
3+
charset-normalizer==2.1.1
4+
Deprecated==1.2.13
5+
google-api-core==2.10.2
6+
google-auth==2.14.1
7+
google-cloud-monitoring==2.11.3
8+
googleapis-common-protos==1.57.0
9+
grpcio==1.50.0
10+
grpcio-status==1.50.0
11+
idna==3.4
12+
opentelemetry-api==1.14.0
13+
../../../opentelemetry-exporter-gcp-monitoring
14+
opentelemetry-sdk==1.14.0
15+
opentelemetry-semantic-conventions==0.35b0
16+
proto-plus==1.22.1
17+
protobuf==4.21.9
18+
pyasn1==0.4.8
19+
pyasn1-modules==0.2.8
20+
requests==2.28.1
21+
rsa==4.9
22+
six==1.16.0
23+
typing_extensions==4.4.0
24+
urllib3==1.26.12
25+
wrapt==1.14.1
Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
1-
cachetools==4.2.1
2-
certifi==2020.12.5
3-
chardet==4.0.0
4-
google-api-core==1.26.3
5-
google-auth==1.28.0
6-
google-cloud-core==1.6.0
7-
google-cloud-trace==0.24.0
8-
googleapis-common-protos==1.53.0
9-
grpcio==1.37.0
10-
idna==2.10
11-
opentelemetry-api==1.0.0
1+
cachetools==5.2.0
2+
certifi==2022.9.24
3+
charset-normalizer==2.1.1
4+
Deprecated==1.2.13
5+
google-api-core==2.10.2
6+
google-auth==2.14.1
7+
google-cloud-trace==1.7.3
8+
googleapis-common-protos==1.57.0
9+
grpcio==1.50.0
10+
grpcio-status==1.50.0
11+
idna==3.4
12+
opentelemetry-api==1.14.0
1213
../../../opentelemetry-exporter-gcp-trace/
13-
opentelemetry-sdk==1.0.0
14-
packaging==20.9
15-
protobuf==3.18.3
14+
opentelemetry-sdk==1.14.0
15+
opentelemetry-semantic-conventions==0.35b0
16+
proto-plus==1.22.1
17+
protobuf==4.21.9
1618
pyasn1==0.4.8
1719
pyasn1-modules==0.2.8
18-
pyparsing==2.4.7
19-
pytz==2021.1
20-
requests==2.25.1
21-
rsa==4.7.2
22-
six==1.15.0
23-
urllib3==1.26.5
20+
requests==2.28.1
21+
rsa==4.9
22+
six==1.16.0
23+
typing_extensions==4.4.0
24+
urllib3==1.26.12
25+
wrapt==1.14.1

docs/examples/flask_e2e/README.rst

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
End-to-End Example with Flask
33
=============================
44

5-
This end-to-end example shows how to instrument a Flask app with
6-
OpenTelemetry to send traces to Cloud Trace. In addition, there is a client
7-
script that uses ``requests`` to call the Flask app and propagate context with
8-
the GCP context propagator.
5+
This end-to-end example shows how to instrument a Flask app with OpenTelemetry to send traces
6+
to Cloud Trace and metrics to Cloud Monitoring. OpenTelemetry instrumentation for Flask and
7+
requests will automatically generate spans and metrics for you. In addition, there is a client
8+
script that uses ``requests`` to call the Flask app and propagate context with the GCP context
9+
propagator.
910

1011
To run this example you first need to:
1112
* Create a Google Cloud project. You can `create one here <https://console.cloud.google.com/projectcreate>`_.
@@ -29,6 +30,7 @@ Install Dependencies
2930
.. code-block:: sh
3031
3132
pip install opentelemetry-exporter-gcp-trace \
33+
opentelemetry-exporter-gcp-monitoring \
3234
opentelemetry-propagator-gcp \
3335
opentelemetry-api \
3436
opentelemetry-sdk \
@@ -71,16 +73,32 @@ Checking Output
7173
---------------
7274

7375
After running any of these examples, you can go to `Cloud Trace overview
74-
<https://console.cloud.google.com/traces/list>`_ to see the results. You
75-
should see something like the image below with a root span covering the whole
76-
client request and a child span covering the Flask server processing the
77-
request.
76+
<https://console.cloud.google.com/traces/list>`_ and `Cloud Monitoring Metrics Explorer page
77+
<https://console.cloud.google.com/monitoring/metrics-explorer>`_ to see the results. You should
78+
see something like the image below with a root span covering the whole client request and a
79+
child span covering the Flask server processing the request. For metrics, you should see
80+
various metrics created for monitored resource ``generic_task`` with "category" Http e.g.
81+
``workload.googleapis.com/http.server.duration``. Client side metrics should be populated as
82+
well e.g. ``workload.googleapis.com/http.client.duration``.
7883

7984
.. image:: gct_result.png
8085
:alt: GCT result
8186

87+
.. image:: metrics_explorer.png
88+
:alt: Metrics explorer search
89+
90+
.. image:: gcm_latency.png
91+
:alt: GCM heatmap of client latency
8292

8393
Further Reading
8494
---------------
8595

96+
Troubleshooting
97+
--------------------------
98+
99+
``google.api_core.exceptions.Aborted: 409 [...] error: Too many concurrent edits to the project configuration. Please try again.``
100+
##################################################################################################################################
101+
102+
This is a transient error when a metric is first written to Cloud Monitoring. Try again and things should work fine.
103+
86104
* `More information about exporters in general <https://opentelemetry-python.readthedocs.io/en/stable/getting-started.html#configure-exporters-to-emit-spans-elsewhere>`_

docs/examples/flask_e2e/client.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,32 @@
1414
# limitations under the License.
1515

1616
import requests
17-
from opentelemetry import trace
17+
from opentelemetry import metrics, trace
18+
from opentelemetry.exporter.cloud_monitoring import (
19+
CloudMonitoringMetricsExporter,
20+
)
1821
from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
1922
from opentelemetry.instrumentation.requests import RequestsInstrumentor
2023
from opentelemetry.propagate import set_global_textmap
2124
from opentelemetry.propagators.cloud_trace_propagator import (
2225
CloudTraceFormatPropagator,
2326
)
27+
from opentelemetry.sdk.metrics import MeterProvider
28+
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
29+
from opentelemetry.sdk.resources import Resource
2430
from opentelemetry.sdk.trace import TracerProvider
2531
from opentelemetry.sdk.trace.export import BatchSpanProcessor
2632

2733
set_global_textmap(CloudTraceFormatPropagator())
2834

35+
resource = Resource.create(
36+
{
37+
"service.name": "flask_e2e_client",
38+
"service.namespace": "examples",
39+
"service.instance.id": "instance554",
40+
}
41+
)
42+
2943
tracer_provider = TracerProvider()
3044
cloud_trace_exporter = CloudTraceSpanExporter()
3145
tracer_provider.add_span_processor(
@@ -34,9 +48,21 @@
3448
# tweaked to optimize your performance
3549
BatchSpanProcessor(cloud_trace_exporter)
3650
)
51+
52+
meter_provider = MeterProvider(
53+
metric_readers=[
54+
PeriodicExportingMetricReader(
55+
CloudMonitoringMetricsExporter(), export_interval_millis=5000
56+
)
57+
],
58+
resource=resource,
59+
)
60+
3761
trace.set_tracer_provider(tracer_provider)
62+
metrics.set_meter_provider(meter_provider)
3863

3964
tracer = trace.get_tracer(__name__)
65+
meter = metrics.get_meter(__name__)
4066

4167
RequestsInstrumentor().instrument()
4268

306 KB
Loading
227 KB
Loading
Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,39 @@
1-
asgiref==3.3.4
2-
cachetools==4.2.1
3-
certifi==2020.12.5
4-
chardet==4.0.0
5-
click==7.1.2
6-
Flask==1.1.2
7-
google-api-core==1.26.3
8-
google-auth==1.28.0
9-
google-cloud-core==1.6.0
10-
google-cloud-trace==0.24.0
11-
googleapis-common-protos==1.53.0
12-
grpcio==1.37.0
13-
idna==2.10
14-
itsdangerous==1.1.0
15-
Jinja2==2.11.3
16-
MarkupSafe==1.1.1
17-
opentelemetry-api==1.0.0
1+
cachetools==5.2.0
2+
certifi==2022.9.24
3+
charset-normalizer==2.1.1
4+
click==8.1.3
5+
Deprecated==1.2.13
6+
Flask==2.2.2
7+
google-api-core==2.10.2
8+
google-auth==2.14.1
9+
google-cloud-monitoring==2.11.3
10+
google-cloud-trace==1.7.3
11+
googleapis-common-protos==1.57.0
12+
grpcio==1.50.0
13+
grpcio-status==1.50.0
14+
idna==3.4
15+
itsdangerous==2.1.2
16+
Jinja2==3.1.2
17+
MarkupSafe==2.1.1
18+
opentelemetry-api==1.14.0
19+
../../../opentelemetry-exporter-gcp-monitoring
1820
../../../opentelemetry-exporter-gcp-trace
1921
../../../opentelemetry-propagator-gcp
20-
opentelemetry-instrumentation==0.19b0
21-
opentelemetry-instrumentation-flask==0.19b0
22-
opentelemetry-instrumentation-requests==0.19b0
23-
opentelemetry-instrumentation-wsgi==0.19b0
24-
opentelemetry-sdk==1.0.0
25-
opentelemetry-util-http==0.19b0
26-
packaging==20.9
27-
protobuf==3.18.3
22+
opentelemetry-instrumentation==0.35b0
23+
opentelemetry-instrumentation-requests==0.35b0
24+
opentelemetry-instrumentation-flask==0.35b0
25+
opentelemetry-instrumentation-wsgi==0.35b0
26+
opentelemetry-sdk==1.14.0
27+
opentelemetry-semantic-conventions==0.35b0
28+
opentelemetry-util-http==0.35b0
29+
proto-plus==1.22.1
30+
protobuf==4.21.9
2831
pyasn1==0.4.8
2932
pyasn1-modules==0.2.8
30-
pyparsing==2.4.7
31-
pytz==2021.1
32-
requests==2.25.1
33-
rsa==4.7.2
34-
six==1.15.0
35-
urllib3==1.26.5
36-
Werkzeug==1.0.1
37-
wrapt==1.12.1
33+
requests==2.28.1
34+
rsa==4.9
35+
six==1.16.0
36+
typing_extensions==4.4.0
37+
urllib3==1.26.12
38+
Werkzeug==2.2.2
39+
wrapt==1.14.1

0 commit comments

Comments
 (0)