mcpField
L
logfire

logfire

github.com/jiatastic開発1078 回インストール40 週間前に更新
リポジトリ

logfire について

Logfire は、アプリケーションやサービスを計測する Python 開発者向けのオブザーバビリティスキルです。構造化ログ、トレース、メトリクス、多様な連携に加え、LLM と MCP の処理追跡も扱います。

主な機能

  1. 01構造化ログとトレース
  2. 02カスタムメトリクスとスパン
  3. 03フレームワークやライブラリの計測
  4. 04LLM と MCP の計測
  5. 05スクラビング、サンプリング、テスト時の記録

活用シーン

  1. 01Python の Web サービスやデータベースクライアントを計測
  2. 02Pydantic AI や MCP の処理を追跡
  3. 03出力スパンをテストしテレメトリー量を調整

MCP 対応

Logfire は MCP の処理を計測する `instrument_mcp()` を提供します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jiatastic/open-python-skills --skill logfire

インストール後、Claude Code で/logfireを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
advanced.md
configuration.md
integrations.md
metrics.md
pitfalls.md

詳細

Logfire

Pydantic Logfire を使用した、Python 向けの構造化オブザーバビリティです。すばやくセットアップでき、強力な機能を備え、OpenTelemetry に対応しています。

クイックスタート

uv pip install logfire
import logfire

logfire.configure(service_name="my-api", service_version="1.0.0")
logfire.info("Application started")

基本パターン

1. サービス設定

起動時に必ずサービスのメタデータを設定します。

import logfire

logfire.configure(
    service_name="backend",
    service_version="1.0.0",
    environment="production",
    console=False,           # Disable console output in production
    send_to_logfire=True,    # Send to Logfire platform
)
2. フレームワークの計装

クライアントやアプリを作成する前にフレームワークを計装します。

import logfire
from fastapi import FastAPI

# Configure FIRST
logfire.configure(service_name="backend")

# Then instrument
logfire.instrument_fastapi()
logfire.instrument_httpx()
logfire.instrument_sqlalchemy()

# Then create app
app = FastAPI()
3. ログレベルと構造化ログ
# All log levels (trace → fatal)
logfire.trace("Detailed trace", step=1)
logfire.debug("Debug context", variable=locals())
logfire.info("User action", action="login", success=True)
logfire.notice("Important event", event_type="milestone")
logfire.warn("Potential issue", threshold_exceeded=True)
logfire.error("Operation failed", error_code=500)
logfire.fatal("Critical failure", component="database")

# Python 3.11+ f-string magic (auto-extracts variables)
user_id = 123
status = "active"
logfire.info(f"User {user_id} status: {status}")
# Equivalent to: logfire.info("User {user_id}...", user_id=user_id, status=status)

# Exception logging with automatic traceback
try:
    risky_operation()
except Exception:
    logfire.exception("Operation failed", context="extra_info")
4. 手動スパン
# Spans for tracing operations
with logfire.span("Process order {order_id}", order_id="ORD-123"):
    logfire.info("Validating cart")
    # ... processing logic
    logfire.info("Order complete")

# Dynamic span attributes
with logfire.span("Database query") as span:
    results = execute_query()
    span.set_attribute("result_count", len(results))
    span.message = f"Query returned {len(results)} results"
5. カスタムメトリクス
# Counter - monotonically increasing
request_counter = logfire.metric_counter("http.requests", unit="1")
request_counter.add(1, {"endpoint": "/api/users", "method": "GET"})

# Gauge - current value
temperature = logfire.metric_gauge("temperature", unit="°C")
temperature.set(23.5)

# Histogram - distribution of values
latency = logfire.metric_histogram("request.duration", unit="ms")
latency.record(45.2, {"endpoint": "/api/data"})
6. LLM のオブザーバビリティ
import logfire
from pydantic_ai import Agent

logfire.configure()
logfire.instrument_pydantic_ai()  # Traces all agent interactions

agent = Agent("openai:gpt-4o", system_prompt="You are helpful.")
result = agent.run_sync("Hello!")
7. ノイズの多い計装を抑制する
# Suppress entire scope (e.g., noisy library)
logfire.suppress_scopes("google.cloud.bigquery.opentelemetry_tracing")

# Suppress specific code block
with logfire.suppress_instrumentation():
    client.get("https://internal-healthcheck.local")  # Not traced
8. 機密データのスクラブ
import logfire

# Add custom patterns to scrub
logfire.configure(
    scrubbing=logfire.ScrubbingOptions(
        extra_patterns=["api_key", "secret", "token"]
    )
)

# Custom callback for fine-grained control
def scrubbing_callback(match: logfire.ScrubMatch):
    if match.path == ("attributes", "safe_field"):
        return match.value  # Don't scrub this field
    return None  # Use default scrubbing

logfire.configure(
    scrubbing=logfire.ScrubbingOptions(callback=scrubbing_callback)
)
9. 高トラフィックのサービス向けサンプリング
import logfire

# Sample 50% of traces
logfire.configure(sampling=logfire.SamplingOptions(head=0.5))

# Disable metrics to reduce volume
logfire.configure(metrics=False)
10. テスト
import logfire
from logfire.testing import CaptureLogfire

def test_user_creation(capfire: CaptureLogfire):
    create_user("Alice", "[email protected]")
    
    spans = capfire.exporter.exported_spans
    assert len(spans) >= 1
    assert spans[0].attributes["user_name"] == "Alice"
    
    capfire.exporter.clear()  # Clean up for next test

利用可能なインテグレーション

カテゴリインテグレーション方法
WebFastAPIlogfire.instrument_fastapi(app)
Starlettelogfire.instrument_starlette(app)
Djangologfire.instrument_django()
Flasklogfire.instrument_flask(app)
AIOHTTP Serverlogfire.instrument_aiohttp_server()
ASGIlogfire.instrument_asgi(app)
WSGIlogfire.instrument_wsgi(app)
HTTPHTTPXlogfire.instrument_httpx()
Requestslogfire.instrument_requests()
AIOHTTP Clientlogfire.instrument_aiohttp_client()
データベースSQLAlchemylogfire.instrument_sqlalchemy(engine)
Asyncpglogfire.instrument_asyncpg()
Psycopglogfire.instrument_psycopg()
Redislogfire.instrument_redis()
PyMongologfire.instrument_pymongo()
LLMPydantic AIlogfire.instrument_pydantic_ai()
OpenAIlogfire.instrument_openai()
Anthropiclogfire.instrument_anthropic()
MCPlogfire.instrument_mcp()
タスクCelerylogfire.instrument_celery()
AWS Lambdalogfire.instrument_aws_lambda()
ロギング標準ロギングlogfire.instrument_logging()
Structloglogfire.instrument_structlog()
Logurulogfire.instrument_loguru()
Printlogfire.instrument_print()
その他Pydanticlogfire.instrument_pydantic()
システムメトリクスlogfire.instrument_system_metrics()

よくある落とし穴

問題症状対処法
サービス名が設定されていないUI でスパンを見つけにくいconfigure() で service_name を設定する
計装のタイミングが遅いスパンが記録されないクライアントを作成する前に configure() を呼び出す
カーディナリティの高い属性ストレージの使用量が急増する属性にはペイロード全体ではなく ID を使う
コンソールのノイズログが stdout を汚す本番環境では console=False を設定する

参考資料

コメント