This commit is contained in:
Waylon S. Walker 2025-05-23 10:24:41 -05:00
parent 0a4b32dffe
commit 774ea44af1
9 changed files with 160 additions and 115 deletions

View file

@ -2,49 +2,42 @@ apiVersion: v1
kind: ConfigMap
metadata:
name: my-python-app
namespace: meta
namespace: prod
data:
main.py: |
import time
import random
from flask import Flask
from opentelemetry import trace
from opentelemetry import trace, metrics
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.flask import FlaskInstrumentor
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.instrumentation.flask import FlaskInstrumentor
import logging
from opentelemetry.trace import get_current_span
SERVICE_NAME = "my-flask-app" # match your OTEL resource name
# === Resource ===
resource = Resource(attributes={"service.name": "my-flask-app"})
trace.set_tracer_provider(
TracerProvider(resource=Resource.create({"service.name": "my-flask-app"}))
)
# === Tracing ===
trace.set_tracer_provider(TracerProvider(resource=resource))
tracer = trace.get_tracer(__name__)
span_processor = BatchSpanProcessor(OTLPSpanExporter())
trace.get_tracer_provider().add_span_processor(span_processor)
# === Logging with trace ID ===
class TraceIdFilter(logging.Filter):
def filter(self, record):
span = trace.get_current_span()
ctx = span.get_span_context()
if ctx.trace_id != 0:
record.trace_id = format(ctx.trace_id, "032x")
record.span_id = format(ctx.span_id, "016x")
record.service_name = SERVICE_NAME
else:
record.trace_id = None
record.span_id = None
record.trace_id = format(ctx.trace_id, "032x") if ctx.trace_id != 0 else None
record.span_id = format(ctx.span_id, "016x") if ctx.span_id != 0 else None
return True
formatter = logging.Formatter(
'{"message": "%(message)s", "trace_id": "%(trace_id)s", "span_id": "%(span_id)s", "service_name": "my-flask-app"}'
'{"message": "%(message)s", "trace_id": "%(trace_id)s", "span_id": "%(span_id)s"}'
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
@ -54,43 +47,22 @@ data:
logger.setLevel(logging.INFO)
logger.addHandler(handler)
resource = Resource(
attributes={
"service.name": "python-otel-demo-app", # 👈 choose any name you like
}
)
trace.set_tracer_provider(TracerProvider(resource=resource))
tracer = trace.get_tracer(__name__)
otlp_exporter = OTLPSpanExporter(
endpoint="http://otel-collector.meta.svc:4318/v1/traces",
# insecure=True,
)
span_processor = BatchSpanProcessor(otlp_exporter)
trace.get_tracer_provider().add_span_processor(span_processor)
# === Flask App ===
app = Flask(__name__)
FlaskInstrumentor().instrument_app(app)
def get_trace_id():
span = get_current_span()
if span:
return span.get_span_context().trace_id
return None
FlaskInstrumentor().instrument_app(app) # auto-instruments metrics + traces
@app.route("/")
def root():
with tracer.start_as_current_span("handle_homepage"):
logger.info("handling request", extra={"trace_id": get_trace_id()})
logger.info(
"handling request",
extra={"trace_id": get_current_span().get_span_context().trace_id},
)
time.sleep(random.random() * 0.05) # simulate request parsing
fetch_user()
calculate_recommendations()
return "Hello from / with traces!"
return "Hello from / with traces and metrics!"
def fetch_user():
@ -112,7 +84,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
name: python-otel
namespace: meta
namespace: prod
labels:
app: python-otel
spec:
@ -156,7 +128,7 @@ apiVersion: v1
kind: Service
metadata:
name: python-otel
namespace: meta
namespace: prod
spec:
selector:
app: python-otel