OpenTelemetry nginx module
OpenTelemetryのNginx向けモジュール。
2022/11/08時点では、リリース配布物を定義しておらず、GitHub Actionsで生成した.soを使うよう説明されている。
自分でビルドすることも可能。
https://github.com/open-telemetry/opentelemetry-cpp-contrib/blob/main/instrumentation/nginx/README.md
Adds OpenTelemetry distributed tracing support to nginx.
shimizukawa.icon説明すくなっ
OpenTelemetry WebServer moduleと比べて、こちらの方が使いやすい
設定ファイルがtoml
nginxのディレクティブを多数提供
クライアントがtraceparentを提供しない場合にtrace_idを生成してくれる
shimizukawa.iconが動かすまでにやったこと
Nginx 1.22.0 を使用
https://nginx.org/en/download.html
2022/11/08 時点のStableは1.22.1だが、GitHub Actionsでビルドされたsoが1.22.0向けのため。
otel_ngx_module-debian-11.3-stable.so.zip をダウンロード
https://github.com/open-telemetry/opentelemetry-cpp-contrib/actions/runs/3251893534
このURLはそのうち参照期限が切れると思う
NginxのDockerイメージに追加設定してbuild
code:Dockerfile
# https://github.com/open-telemetry/opentelemetry-cpp-contrib/blob/main/instrumentation/nginx/README.md
# supports: 1.22.0
ARG VARIANT=1.22.0
FROM nginx:${VARIANT}
RUN apt-get update ; apt-get install unzip
# download: https://github.com/open-telemetry/opentelemetry-cpp-contrib/suites/8782080474/artifacts/398699370
# save as: otel_ngx_module-debian-11.3-stable.so.zip
COPY otel_ngx_module-debian-11.3-stable.so.zip /opt
RUN cd /opt ; \
unzip otel_ngx_module-debian-11.3-stable.so.zip -d nginx-${VARIANT}
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/nginx-${VARIANT}/
RUN echo "load_module /opt/nginx-${VARIANT}/otel_ngx_module.so;\n$(cat /etc/nginx/nginx.conf)" > /etc/nginx/nginx.conf
code:bash
$ docker build -t nginx-otel .
設定ファイルを用意
code:nginx-otel.toml
# https://github.com/open-telemetry/opentelemetry-cpp-contrib/blob/0ffedb3406a42627aa5e20aed77e5d21ad133888/instrumentation/nginx/README.md
exporter = "otlp"
processor = "simple"
exporters.otlp
host = "otel-collector"
port = 4317
service
name = "nginx"
code:default.conf
# https://github.com/open-telemetry/opentelemetry-cpp-contrib/blob/main/instrumentation/nginx/README.md
opentelemetry_config /etc/nginx/conf.d/nginx-otel.toml;
# opentelemetry_propagate; # httpに書けるはずだけど、効いてなさそう
log_format otel '$remote_addr - $remote_user $time_local "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$opentelemetry_context_traceparent"';
access_log /var/log/nginx/access.log otel; # log出力が2重になってしまうけど、とりあえず。
server {
listen 80;
server_name api.lvh.me;
opentelemetry_operation_name backend;
# opentelemetry_propagate; # serverに書けるはずだけど、効いてなさそう
location / {
opentelemetry_propagate; # locationに書けば有効
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE, HEAD';
add_header 'Access-Control-Allow-Headers' 'Origin, x-requested-with, Authorization, Accept, Content-Type, traceparent';
# traceparent: github.com/whatwg/fetch/issues/911
add_header 'Access-Control-Max-Age' 86400;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://host.docker.internal:8000;
if ($request_method = 'OPTIONS') {
return 204;
}
}
}
Uptraceでの見え方
https://scrapbox.io/files/636980a29bf258001dc635b4.png