12
12
# See the License for the specific language governing permissions and
13
13
# limitations under the License.
14
14
15
- from opentelemetry import trace
15
+ from opentelemetry import metrics , trace
16
+ from opentelemetry .exporter .otlp .proto .grpc .metric_exporter import (
17
+ OTLPMetricExporter ,
18
+ )
16
19
from opentelemetry .exporter .otlp .proto .grpc .trace_exporter import (
17
20
OTLPSpanExporter ,
18
21
)
22
+ from opentelemetry .sdk .metrics import MeterProvider
23
+ from opentelemetry .sdk .metrics .export import PeriodicExportingMetricReader
19
24
from opentelemetry .sdk .resources import Resource
20
25
from opentelemetry .sdk .trace import TracerProvider
21
26
from opentelemetry .sdk .trace .export import BatchSpanProcessor
41
46
def post_fork (server , worker ):
42
47
server .log .info ("Worker spawned (pid: %s)" , worker .pid )
43
48
44
- resource = Resource .create (attributes = {"service.name" : "api-service" })
49
+ resource = Resource .create (
50
+ attributes = {
51
+ "service.name" : "api-service" ,
52
+ # If workers are not distinguished within attributes, traces and
53
+ # metrics exported from each worker will be indistinguishable. While
54
+ # not necessarily an issue for traces, it is confusing for almost
55
+ # all metric types. A built-in way to identify a worker is by PID
56
+ # but this may lead to high label cardinality. An alternative
57
+ # workaround and additional discussion are available here:
58
+ # https://github.com/benoitc/gunicorn/issues/1352
59
+ "worker" : worker .pid ,
60
+ }
61
+ )
45
62
46
63
trace .set_tracer_provider (TracerProvider (resource = resource ))
47
64
# This uses insecure connection for the purpose of example. Please see the
@@ -50,3 +67,13 @@ def post_fork(server, worker):
50
67
OTLPSpanExporter (endpoint = "http://localhost:4317" , insecure = True )
51
68
)
52
69
trace .get_tracer_provider ().add_span_processor (span_processor )
70
+
71
+ reader = PeriodicExportingMetricReader (
72
+ OTLPMetricExporter (endpoint = "http://localhost:4317" )
73
+ )
74
+ metrics .set_meter_provider (
75
+ MeterProvider (
76
+ resource = resource ,
77
+ metric_readers = [reader ],
78
+ )
79
+ )
0 commit comments