Skip to content

Commit 777fa1e

Browse files
committed
Add example of OpenTelemetry in Optuna Dashboard
1 parent a2b06a4 commit 777fa1e

File tree

5 files changed

+120
-0
lines changed

5 files changed

+120
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
services:
2+
grafana:
3+
image: grafana/grafana:latest
4+
ports:
5+
- "127.0.0.1:13000:3000"
6+
prometheus:
7+
image: prom/prometheus
8+
volumes:
9+
- ./prometheus.yml:/etc/prometheus.yml
10+
command:
11+
- "--config.file=/etc/prometheus.yml"
12+
ports:
13+
- "127.0.0.19090:9090"
14+
otel-collector:
15+
image: ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:latest
16+
volumes:
17+
- ./otel-collector-config.yml:/etc/otel-collector-config.yml
18+
command: ["--config=/etc/otel-collector-config.yml"]
19+
ports:
20+
- "127.0.0.1:8888:8888" # Prometheus metrics exposed by the collector
21+
- "127.0.0.1:8889:8889" # Prometheus exporter metrics
22+
- "127.0.0.1:13133:13133" # health_check extension
23+
- "127.0.0.1:4317:4317" # OTLP gRPC receiver
24+
- "127.0.0.1:4318:4318" # OTLP HTTP receiver

dashboard/opentelemetry/main.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import wsgiref.simple_server
2+
3+
from opentelemetry import metrics
4+
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter
5+
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
6+
from opentelemetry.instrumentation.wsgi import OpenTelemetryMiddleware
7+
from opentelemetry.sdk.metrics import MeterProvider
8+
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
9+
from opentelemetry.sdk.resources import Resource
10+
from optuna.storages import RDBStorage
11+
import optuna_dashboard
12+
13+
14+
SQLALCHEMY_URL = "sqlite:///db.sqlite3"
15+
OTEL_COLLECTOR_ENDPOINT = "http://127.0.0.1:4318/v1/metrics"
16+
17+
18+
def main() -> None:
19+
resource = Resource.create({"service.name": "optuna-dashboard"})
20+
readers = [
21+
PeriodicExportingMetricReader(
22+
OTLPMetricExporter(endpoint=OTEL_COLLECTOR_ENDPOINT),
23+
export_interval_millis=1000,
24+
export_timeout_millis=5000,
25+
),
26+
]
27+
metrics.set_meter_provider(MeterProvider(resource=resource, metric_readers=readers))
28+
29+
# If you want to use PrometheusMetricReader, uncomment the following lines
30+
# from prometheus_client import start_http_server
31+
# from opentelemetry.exporter.prometheus import PrometheusMetricReader
32+
# print("Metrics endpoint: http://127.0.0.1:9464/metrics")
33+
# start_http_server(port=9464, addr="127.0.0.1")
34+
# readers.append(PrometheusMetricReader("optuna_dashboard"))
35+
36+
# If you want to see metrics in the console, uncomment the following line
37+
# from opentelemetry.sdk.metrics.export import ConsoleMetricExporter
38+
# readers.append(PeriodicExportingMetricReader(ConsoleMetricExporter()))
39+
40+
# Enable opentelemetry-instrumentation-sqlalchemy
41+
storage = RDBStorage(SQLALCHEMY_URL, skip_compatibility_check=True, skip_table_creation=True)
42+
SQLAlchemyInstrumentor().instrument(
43+
engine=storage.engine,
44+
meter_provider=metrics.get_meter_provider(),
45+
)
46+
47+
# Enable opentelemetry-instrumentation-wsgi
48+
app = optuna_dashboard.wsgi(storage=storage)
49+
app = OpenTelemetryMiddleware(app, meter_provider=metrics.get_meter_provider())
50+
51+
# Start Optuna Dashboard
52+
with wsgiref.simple_server.make_server("127.0.0.1", 8080, app) as httpd:
53+
httpd.serve_forever()
54+
55+
56+
if __name__ == "__main__":
57+
main()
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
receivers:
2+
otlp:
3+
protocols:
4+
http:
5+
endpoint: otel-collector:4318
6+
cors:
7+
allowed_origins:
8+
- "http://*"
9+
- "https://*"
10+
processors:
11+
batch:
12+
exporters:
13+
prometheus:
14+
endpoint: "0.0.0.0:8889"
15+
debug:
16+
verbosity: detailed
17+
extensions:
18+
health_check:
19+
service:
20+
extensions: ["health_check"]
21+
pipelines:
22+
metrics:
23+
receivers: [otlp]
24+
processors: [batch]
25+
exporters: [prometheus, debug]
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
global:
2+
scrape_interval: 15s
3+
scrape_configs:
4+
- job_name: "prometheus"
5+
scrape_interval: 5s
6+
static_configs:
7+
- targets: ["otel-collector:8889"]
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
optuna-dashboard
2+
opentelemetry-api>=1.34.1
3+
opentelemetry-exporter-otlp>=1.34.1
4+
opentelemetry-exporter-prometheus>=0.55b1
5+
opentelemetry-sdk>=1.34.1
6+
opentelemetry-instrumentation-wsgi
7+
opentelemetry-instrumentation-sqlalchemy

0 commit comments

Comments
 (0)