AI

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実装も同様の方法で構築できます。

機能比較表

比較項目SigNozGrafana+PrometheusDatadog(参考)
セットアップ難易度簡単(オールインワン)中程度(個別設定)不要(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以上)ではParentBasedSamplerTraceIdRatioBasedの組み合わせが最善です。

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

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。