Skip to content

Commit 75e8648

Browse files
authored
Merge pull request #41 from godon-dev/otel_instrumenation_logging
Add shared OTel logging helper for instrumented scripts
2 parents 81f509b + 9f9546b commit 75e8648

2 files changed

Lines changed: 80 additions & 0 deletions

File tree

shared/component.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
name: shared
2+
target: controller/shared
3+
workspace: godon
4+
5+
scripts:
6+
- pattern: "*.py"
7+
settings:
8+
summary: "Shared utilities for godon-controller"
9+
description: "Common modules including OTel logging, helpers"
10+
tag: "default"

shared/otel_logging.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#requirements:
2+
#opentelemetry-api
3+
#opentelemetry-sdk
4+
#opentelemetry-exporter-otlp
5+
6+
import os
7+
import logging
8+
from opentelemetry import trace
9+
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
10+
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
11+
from opentelemetry.sdk.trace import TracerProvider
12+
from opentelemetry.sdk.trace.export import BatchSpanProcessor
13+
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
14+
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
15+
from opentelemetry.sdk.resources import Resource
16+
17+
OTEL_ENDPOINT = os.environ.get(
18+
"OTEL_EXPORTER_OTLP_ENDPOINT",
19+
"http://godon-observability-opentelemetry-collector.godon-observability.svc.cluster.local:4318"
20+
)
21+
22+
_service_name = os.environ.get("OTEL_SERVICE_NAME", "godon-controller")
23+
_tracer = None
24+
_logger_provider = None
25+
_initialized = False
26+
27+
28+
def init_telemetry(service_name: str = None):
29+
global _tracer, _logger_provider, _initialized, _service_name
30+
31+
if _initialized:
32+
return _tracer, _logger_provider
33+
34+
if service_name:
35+
_service_name = service_name
36+
37+
resource = Resource.create({"service.name": _service_name})
38+
39+
tracer_provider = TracerProvider(resource=resource)
40+
tracer_provider.add_span_processor(
41+
BatchSpanProcessor(OTLPSpanExporter(endpoint=f"{OTEL_ENDPOINT}/v1/traces"))
42+
)
43+
trace.set_tracer_provider(tracer_provider)
44+
_tracer = trace.get_tracer(_service_name)
45+
46+
_logger_provider = LoggerProvider(resource=resource)
47+
_logger_provider.add_log_record_processor(
48+
BatchLogRecordProcessor(OTLPLogExporter(endpoint=f"{OTEL_ENDPOINT}/v1/logs"))
49+
)
50+
51+
_initialized = True
52+
return _tracer, _logger_provider
53+
54+
55+
def get_logger(name: str, service_name: str = None) -> logging.Logger:
56+
init_telemetry(service_name)
57+
58+
logger = logging.getLogger(name)
59+
logger.setLevel(logging.DEBUG)
60+
61+
if not any(isinstance(h, LoggingHandler) for h in logger.handlers):
62+
handler = LoggingHandler(logger_provider=_logger_provider)
63+
logger.addHandler(handler)
64+
65+
return logger
66+
67+
68+
def get_tracer(service_name: str = None):
69+
init_telemetry(service_name)
70+
return _tracer

0 commit comments

Comments
 (0)