OSSオブザーバビリティ完全ガイド:OpenTelemetry + Grafana + SigNoz でDevOps監視基盤を構築する
オープンソースラボ編集部 ・ 2026年6月13日
OSSオブザーバビリティ完全ガイド:OpenTelemetry + Grafana + SigNoz でDevOps監視基盤を構築する
Datadog(月$15/ホスト〜)・New Relic(月$25/ユーザー〜)・Dynatrace(月$69/ホスト〜)に対して、OpenTelemetry(ベンダー中立なテレメトリ標準)・Grafana OSS(メトリクス可視化)・SigNoz(オールインワンOSSオブザーバビリティ)はSaaS費用を大幅に削減できるOSSの監視基盤です。
OSSオブザーバビリティを選ぶ理由
- コスト: Datadog 10ホスト構成では月$150+。SigNozセルフホストでほぼ0円に
- ベンダーロックイン回避: OpenTelemetryはCNCF標準でDatadog/Jaeger/Grafana Tempoに切り替え可能
- データ主権: ログ・トレースに機密情報(ユーザーID・リクエストボディ)が含まれる場合に社内保持
- スケーラビリティ: ClickHouseバックエンドのSigNozは大規模トレースを低コストで保存
オブザーバビリティの3本柱
Metrics(メトリクス) → Prometheus / Grafana
Logs(ログ) → Loki / Grafana
Traces(トレース) → Jaeger / Grafana Tempo / SigNoz
OpenTelemetryはこれらすべてのテレメトリを統一的に収集する計装ライブラリです。
OpenTelemetry で計装する
Python アプリケーションの計装
# OpenTelemetry Python SDK のインストール
pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-grpc opentelemetry-instrumentation-fastapi opentelemetry-instrumentation-httpx opentelemetry-instrumentation-sqlalchemy
# 自動計装(FastAPIアプリをゼロコードで計装)
opentelemetry-instrument --service-name my-api --exporter-otlp-endpoint http://localhost:4317 uvicorn app.main:app --host 0.0.0.0 --port 8000
# FastAPI + OpenTelemetry 手動計装
from fastapi import FastAPI, Request
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
import httpx
# TracerProviderの設定(SigNozまたはGrafana Tempoにエクスポート)
provider = TracerProvider()
provider.add_span_processor(
BatchSpanProcessor(
OTLPSpanExporter(
endpoint="http://signoz-otel-collector:4317",
insecure=True,
)
)
)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
# FastAPIを自動計装
app = FastAPI(title="My OSS API")
FastAPIInstrumentor.instrument_app(app)
HTTPXClientInstrumentor().instrument() # httpxの外部APIコールも自動トレース
@app.get("/users/{user_id}")
async def get_user(user_id: str):
# カスタムスパンでビジネスロジックを追跡
with tracer.start_as_current_span("fetch_user_from_db") as span:
span.set_attribute("user.id", user_id)
span.set_attribute("db.system", "postgresql")
# DBクエリの模擬
import asyncio
await asyncio.sleep(0.01)
user = {"id": user_id, "name": "田中太郎"}
span.set_attribute("user.found", True)
return user
@app.get("/external-data")
async def get_external_data():
# HTTPXを使った外部APIコール(自動的にトレース伝播される)
async with httpx.AsyncClient() as client:
resp = await client.get("https://api.github.com/repos/SigNoz/signoz")
return {"stars": resp.json()["stargazers_count"]}
Next.js アプリケーションの計装
// instrumentation.ts(Next.js 13.4+ の計装フック)
// ファイルをプロジェクトルートに配置
import { NodeSDK } from '@opentelemetry/sdk-node'
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc'
import { Resource } from '@opentelemetry/resources'
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'
export async function register() {
if (process.env.NEXT_RUNTIME === 'nodejs') {
const sdk = new NodeSDK({
resource: new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: 'opensourcelab-nextjs',
[SemanticResourceAttributes.SERVICE_VERSION]: process.env.npm_package_version ?? '0.0.0',
environment: process.env.NODE_ENV ?? 'development',
}),
traceExporter: new OTLPTraceExporter({
url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? 'http://localhost:4317',
}),
instrumentations: [
getNodeAutoInstrumentations({
'@opentelemetry/instrumentation-fs': { enabled: false }, // FSは除外(ノイズが多い)
'@opentelemetry/instrumentation-http': { enabled: true },
'@opentelemetry/instrumentation-fetch': { enabled: true },
}),
],
})
sdk.start()
}
}
SigNoz でオールインワン監視
SigNozはClickHouseをバックエンドに使うGo製のOSSオブザーバビリティプラットフォームです(GitHubスター20k+)。Metrics・Logs・Tracesを1つのUIで確認できます。
# docker-compose.yml - SigNoz をセルフホスト(簡易版)
version: '3.8'
services:
clickhouse:
image: clickhouse/clickhouse-server:24.1.2-alpine
restart: unless-stopped
ulimits:
nofile:
soft: 262144
hard: 262144
volumes:
- ./signoz/clickhouse:/var/lib/clickhouse
environment:
CLICKHOUSE_USER: admin
CLICKHOUSE_PASSWORD: password
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "1"
healthcheck:
test: wget --no-verbose --tries=1 --spider http://localhost:8123/ping || exit 1
otel-collector:
image: signoz/signoz-otel-collector:0.102.0
restart: unless-stopped
ports:
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
environment:
OTEL_RESOURCE_ATTRIBUTES: host.name=signoz-host,os.type=linux
SIGNOZ_COMPONENT: otel-collector
STORAGE: clickhouse
CLICKHOUSE_HOST: clickhouse
CLICKHOUSE_PASSWORD: password
depends_on:
clickhouse:
condition: service_healthy
query-service:
image: signoz/query-service:0.45.0
restart: unless-stopped
ports:
- "8080:8080"
environment:
PromConfigPath: /root/config/prometheus.yml
STORAGE: clickhouse
CLICKHOUSE_URL: tcp://clickhouse:9000/?database=signoz_traces&username=admin&password=password
SIGNOZ_LOCAL_DB_PATH: /var/lib/signoz/signoz.db
depends_on:
clickhouse:
condition: service_healthy
volumes:
- ./signoz/query:/var/lib/signoz
frontend:
image: signoz/frontend:0.45.0
restart: unless-stopped
ports:
- "3301:3301"
environment:
NGINX_CONFIG_PATH: /etc/nginx/conf.d/default.conf
depends_on:
- query-service
Grafana + Prometheus + Loki スタック
# docker-compose.yml - Grafana LGTM スタック(Loki・Grafana・Tempo・Mimir)
version: '3.8'
services:
prometheus:
image: prom/prometheus:v2.51.0
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=15d'
grafana:
image: grafana/grafana:10.4.0
restart: unless-stopped
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_PASSWORD: admin_password
GF_FEATURE_TOGGLES_ENABLE: traceqlEditor metricsSummary
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning # データソース自動設定
loki:
image: grafana/loki:2.9.4
restart: unless-stopped
ports:
- "3100:3100"
volumes:
- loki_data:/loki
command: -config.file=/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:2.9.4
restart: unless-stopped
volumes:
- /var/log:/var/log
- ./promtail-config.yml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
volumes:
prometheus_data:
grafana_data:
loki_data:
# prometheus.yml - メトリクス収集設定
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'my-api'
static_configs:
- targets: ['my-api:8000'] # FastAPIアプリ
metrics_path: /metrics
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100'] # ホストメトリクス
- job_name: 'postgres-exporter'
static_configs:
- targets: ['postgres-exporter:9187'] # PostgreSQL メトリクス
DevOpsカテゴリ/categories/devopsのk9s・Lensと組み合わせてKubernetesクラスタのオブザーバビリティを統合管理します。LLMツールカテゴリ/categories/llm-toolsのLLMアプリにOpenTelemetry計装を追加してレイテンシー・コスト・エラー率を監視するLLMObs実装も同様の方法で構築できます。
機能比較表
| 比較項目 | SigNoz | Grafana+Prometheus | Datadog(参考) |
|---|---|---|---|
| セットアップ難易度 | 簡単(オールインワン) | 中程度(個別設定) | 不要(SaaS) |
| Metrics | ✅ | ✅ | ✅ |
| Logs | ✅ | ✅(Loki) | ✅ |
| Traces | ✅ | ✅(Tempo) | ✅ |
| APM(サービスマップ) | ✅ | △ | ✅ |
| 月額コスト(10ホスト) | $0(セルフホスト) | $0(セルフホスト) | $150〜 |
FAQ
Q. OpenTelemetryを導入するとパフォーマンスに影響はありますか?
A. 軽微な影響はありますが、本番利用に支障がない範囲です。計測: FastAPIアプリで自動計装を有効化した場合、オーバーヘッドは通常1〜3ms/リクエスト(レイテンシーの1〜5%程度)。BatchSpanProcessor(デフォルト)はスパンを非同期バッファリングしてエクスポートするため、HTTPレスポンスはブロックされません。最適化: ①サンプリングレートを設定(本番では全トレースの10〜50%のみ収集)②@opentelemetry/instrumentation-fsなど無関係なインストゥルメンテーションを無効化③FlushTimeout/BatchSize をチューニング。高トラフィック(1000 req/s以上)ではParentBasedSamplerとTraceIdRatioBasedの組み合わせが最善です。
Q. SigNozとGrafana+Prometheusどちらを選ぶべきですか?
A. スタートアップ・中小規模チームにはSigNoz、既存Prometheusエコシステムを持つ組織にはGrafanaを推奨します。SigNozの利点: ①1コマンドでMetrics+Logs+Traces+APMが揃う②OpenTelemetryネイティブな設計③アラート設定がGUIで簡単。Grafanaの利点: ①成熟したエコシステム(2,000+コミュニティダッシュボード)②Prometheusアラートとの統合③既存InfluxDB・CloudWatch・Elasticsearchとも繋がる。移行コスト: 既存Prometheusから移行する場合、SigNozはPrometheusリモートライト対応(prometheus.ymlにremote_writeを追加するだけ)なので両立も可能です。
Q. ClickHouseはなぜオブザーバビリティに向いているのですか?
A. ClickHouseはカラム型ストレージで時系列データ(トレース・ログ・メトリクス)の圧縮と集計クエリが非常に高速です。比較: ①ElasticsearchはJSONを丸ごと保存(高柔軟性・高コスト)。ClickHouseはカラム型でトレースデータを1/5〜1/10に圧縮②集計クエリ(エラーレート・P95レイテンシー)はClickHouseが10〜100倍高速③SigNozのベンチマーク: 100万スパン/日をElasticsearch比で60%少ないディスク容量で保存。セルフホストオブザーバビリティで最もコスパが良い組み合わせはSigNoz(ClickHouseバックエンド)です。
Q. Grafanaのアラートをページャーデューティー代わりにSlackで受け取るには?
A. Grafana Alertingで設定します。①Grafana → Alerting → Contact Points → New Contact Point → Slack②Incoming Webhook URL(Slack App設定から取得)を入力③Notification Policy でアラートとContact Pointを紐付け。アラートルール例: PrometheusQL sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.05(5xxエラー率5%超えで通知)。オンコール体制を組む場合はgrafana-oncall(OSSのPagerDuty代替)も無料で利用できます。
まとめ
| ユースケース | 推奨スタック |
|---|---|
| 初回構築・フルスタック一括 | SigNoz |
| 既存Prometheusとの統合 | Grafana + Prometheus + Loki + Tempo |
| Kubernetes監視 | kube-prometheus-stack(Helmチャート) |
| LLMアプリの監視 | OpenTelemetry + SigNoz |