Skip to content

Instantly share code, notes, and snippets.

@proffalken
Created December 3, 2021 21:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save proffalken/e8a777a1f622701d9c59164f6d47cbf5 to your computer and use it in GitHub Desktop.
Save proffalken/e8a777a1f622701d9c59164f6d47cbf5 to your computer and use it in GitHub Desktop.
export OTEL_PYTHON_LOG_CORRELATION="true"
export OTEL_RESOURCE_ATTRIBUTES="service.name=otlptest, environment=test"
export OTEL_TRACES_EXPORTER="otlphttp"
export OTEL_EXPORTER_OTLP_ENDPOINT="https://otlphttp"
export OTEL_PYTHON_DJANGO_INSTRUMENT="True"
import os
import socket
from flask import Flask
from opentelemetry.instrumentation.flask import FlaskInstrumentor
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.instrumentation.logging import LoggingInstrumentor
# Resource can be required for some backends, e.g. Jaeger
# If resource wouldn't be set - traces wouldn't appears in Jaeger
resource = Resource(attributes={
"service.name": "otlptest"
})
trace.set_tracer_provider(TracerProvider(resource=resource))
tracer = trace.get_tracer(__name__)
otlp_exporter = OTLPSpanExporter(endpoint="https://otlphttp/v1/traces")
span_processor = BatchSpanProcessor(otlp_exporter)
trace.get_tracer_provider().add_span_processor(span_processor)
from logging.config import dictConfig
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'json': {'()': 'pythonjsonlogger.jsonlogger.JsonFormatter'},
'standard': {
'format': '%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] [traceID=%(otelTraceID)s spanID=%(otelSpanID)s resource.service.name=%(otelServiceName)s] - %(message)s',
'datefmt': '%d-%m-%Y %H:%M:%S'
},
},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'standard',
},
'loki': {
'level': 'DEBUG',
'class': 'logging_loki.LokiHandler',
'url': f"{os.getenv('MVENTORY_LOKI_HOST')}/loki/api/v1/push",
'tags': {"app": "otlptest", "env": "dev"},
'version': "1",
'formatter': 'json',
},
},
'loggers': {
'root': {
'handlers': ['loki', 'console'],
'level': 'DEBUG',
'propagate': True,
},
}
}
dictConfig(LOGGING)
LoggingInstrumentor().instrument(set_logging_format=True)
app = Flask(__name__)
FlaskInstrumentor().instrument_app(app)
@app.route("/")
def hello():
return "Hello!"
if __name__ == "__main__":
app.run(debug=True)
backoff==1.10.0
certifi==2021.10.8
charset-normalizer==2.0.9
click==8.0.3
Deprecated==1.2.13
Flask==2.0.2
googleapis-common-protos==1.53.0
grpcio==1.42.0
idna==3.3
itsdangerous==2.0.1
Jinja2==3.0.3
MarkupSafe==2.0.1
opentelemetry-api==1.7.1
opentelemetry-exporter-otlp==1.7.1
opentelemetry-exporter-otlp-proto-grpc==1.7.1
opentelemetry-exporter-otlp-proto-http==1.7.1
opentelemetry-instrumentation==0.26b1
opentelemetry-instrumentation-flask==0.26b1
opentelemetry-instrumentation-logging==0.26b1
opentelemetry-instrumentation-wsgi==0.26b1
opentelemetry-proto==1.7.1
opentelemetry-sdk==1.7.1
opentelemetry-semantic-conventions==0.26b1
opentelemetry-util-http==0.26b1
protobuf==3.19.1
python-json-logger==2.0.2
python-logging-loki==0.3.1
requests==2.26.0
rfc3339==6.2
six==1.16.0
urllib3==1.26.7
uWSGI==2.0.20
Werkzeug==2.0.2
wrapt==1.13.3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment