MCP なしで Datadog を自然言語で操作できる公式 Claude Code プラグインを試してみた
こんにちは。オペレーション部のしいなです。
はじめに
以前、Claude と MCP を組み合わせることで、専門知識がなくても自然言語で Datadog のデータを分析できる記事をご紹介しました。
その後、Datadog の公式 MCP サーバが発表されていますが、現時点ではプレビューとなっており、一般利用できません。[1]
私も利用待ちの1人です。
MCP サーバを待ちきれない方にもおすすめしたいのが、Datadog 公式の Claude Code プラグイン「datadog-api-claude-plugin」です。
こちらは Pup CLI を通じて自然言語で Datadog を操作できます。
今回はプラグインを利用して、自然言語でログ検索・モニター確認・インスタンス調査からコードの自動生成まで、一通り試してみました。
Datadog API Claude プラグイン とは
Datadog API Claude プラグインは、Claude から Pup CLI を通じて Datadog の各種データに自然言語でアクセスできるようにする Datadog 公式のツールです。
このプラグインは MCP サーバを必要とせず、Pup CLI を通じて Claude Code と直接連携する仕組みです。
MCP に依存しないシンプルな構成のため、導入のハードルが低いのも魅力です。
プラグインの構成
datadog-api-claude-plugin/
├── .claude-plugin/
│ └── plugin.json # Plugin metadata (references 46 agents)
├── agents/ # 46 specialized domain agents
│ ├── logs.md
│ ├── metrics.md
│ ├── monitors.md
│ └── ...
├── skills/
│ └── code-generation/ # Code generation skill
│ └── SKILL.md
├── CLAUDE.md # Plugin instructions (symlink to AGENTS.md)
├── AGENTS.md # Comprehensive agent documentation
agents/
agents/ ディレクトリには各Datadog機能領域に特化した専門エージェント(ログ管理、メトリクス、モニターなど)が46個存在しています。
SKILL.md
SKILL.md ファイルには Datadog API 操作のためのコードスニペット自動生成(クライアントの初期化、認証設定、API 呼び出しコード)を行うスキルが指示されています。
言語は Python, Ruby, Go, Java, TypeScript に対応しています。
Datadog 公式 SDK の各言語パッケージを使用しつつ、エラーハンドリングのベストプラクティスを反映しています。
また、認証情報(API キー/APP キー)の設定を含んでいたり、OpenAPI 仕様に基づいた正確なコードを生成できます。
AGENTS.md
プラグイン全体の取扱方法が指示されています。
46個のエージェントをどう使い分けるかの総合ガイドの役割を担います。
なお、CLAUDE.md は AGENTS.md へのシンボリックリンクとなっています。
動作としては以下のイメージです。
プラグインのユースケース
次のような用途で活用が期待できます。
インシデント対応・調査
- 自然言語による障害の初動調査を行い、ログ・メトリクス・トレースを横断的に確認する。
- エラーログからトレース、インフラメトリクスへと自然言語で深掘り調査して根本原因を分析する。
- 障害発生前後のイベントを時系列で整理したタイムラインを作成する。
モニタリング・アラート管理
- No Data 状態やダウンタイム状態が長く継続しているモニターの対象一覧を出して整理する。
- 現在アラート中のモニターや、ダウンタイム設定を確認する。
- 閾値や通知先の妥当性を AI に相談してレビューしてもらう。
運用の効率化
- 複数ダッシュボードの情報を自然言語で横断的に取得する。
- セキュリティシグナルや不審なアクセスパターンを検出してセキュリティ調査を行う。
- 特定のホストやコンテナの詳細情報を取得する。
コーディング支援
- Datadog API 連携コードを自動生成し、コーディングする。
- 定期レポート生成やメトリクス集計のための運用ツールを生成する。
- モニターやダッシュボード設定をコード化(IaC)する。
ナレッジ共有・レポーティング
- 調査結果をもとにインシデントレポートの下書きを生成する。
- 日次・週次の運用レポートを自然言語でまとめる。
セットアップ
前提
- Claude Code CLI がインストール済み
- Node.js インストール済み
- Datadog アカウントが利用可能
- Pup CLI インストール済み
Pup CLI 導入方法についてはこちらの記事をご参考ください。
プラグインインストール
- リポジトリのクローンを行います。
git clone https://github.com/DataDog/datadog-api-claude-plugin.git
Cloning into 'datadog-api-claude-plugin'...
remote: Enumerating objects: 1222, done.
remote: Counting objects: 100% (384/384), done.
remote: Compressing objects: 100% (162/162), done.
remote: Total 1222 (delta 311), reused 231 (delta 221), pack-reused 838 (from 1
Receiving objects: 100% (1222/1222), 1.20 MiB | 3.47 MiB/s, done.
Resolving deltas: 100% (764/764), done.
- skills をインストールします。
npx skills add ./datadog-api-claude-plugin
Need to install the following packages:
skills@1.3.8
Ok to proceed? (y) y
███████╗██╗ ██╗██╗██╗ ██╗ ███████╗
██╔════╝██║ ██╔╝██║██║ ██║ ██╔════╝
███████╗█████╔╝ ██║██║ ██║ ███████╗
╚════██║██╔═██╗ ██║██║ ██║ ╚════██║
███████║██║ ██╗██║███████╗███████╗███████║
╚══════╝╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚══════╝
┌ skills
│
◇ Source: /Users/shiina.yuichi/datadog-claude/datadog-api-claude-plugin
│
◇ Local path validated
│
◇ Found 1 skill
│
● Skill: dd-file-issue
│
│ File GitHub issues to the right repository (pup CLI or plugin)
│
◇ 39 agents
◇ Which agents do you want to install to?
│ Amp, Codex, Gemini CLI, GitHub Copilot, Kimi Code CLI, OpenCode
│
◇ Installation scope
│ Project
│
◇ Installation method
│ Symlink (Recommended)
│
◇ Installation Summary ───────────────────────────────────────────────────────╮
│ │
│ ~/datadog-claude/.agents/skills/dd-file-issue │
│ universal: Amp, Codex, Gemini CLI, GitHub Copilot, Kimi Code CLI +1 more │
│ │
├──────────────────────────────────────────────────────────────────────────────╯
│
◇ Proceed with installation?
│ Yes
│
◇ Installation complete
│
◇ Installed 1 skill ──────────────────────────────────────────────────────────╮
│ │
│ ✓ ~/datadog-claude/.agents/skills/dd-file-issue │
│ universal: Amp, Codex, Gemini CLI, GitHub Copilot, Kimi Code CLI +1 more │
│ │
├──────────────────────────────────────────────────────────────────────────────╯
│
└ Done! Review skills before use; they run with full agent permissions.
│
│ One-time prompt - you won't be asked again if you dismiss.
│
◇ Install the find-skills skill? It helps your agent discover and suggest skills.
│ Yes
│
◇ Installing find-skills skill...
┌ skills
│
◇ Source: https://github.com/vercel-labs/skills.git
│
◇ Repository cloned
│
◇ Found 1 skill
│
● Selected 1 skill: find-skills
│
◇ Installation Summary ───────────────────────────────────────────────────────╮
│ │
│ ~/.agents/skills/find-skills │
│ universal: Amp, Codex, Gemini CLI, GitHub Copilot, Kimi Code CLI +1 more │
│ │
├──────────────────────────────────────────────────────────────────────────────╯
│
◇ Installation complete
│
◇ Installed 1 skill ──────────────────────────────────────────────────────────╮
│ │
│ ✓ ~/.agents/skills/find-skills │
│ universal: Amp, Codex, Gemini CLI, GitHub Copilot, Kimi Code CLI +1 more │
│ │
├──────────────────────────────────────────────────────────────────────────────╯
│
└ Done! Review skills before use; they run with full agent permissions.
- skills が追加されていることを確認します。
npx skills list
Project Skills
dd-file-issue ~/datadog-claude/.agents/skills/dd-file-issue
Agents: Replit
Datadog 認証情報設定(オプション)
Pup CLI の OAuth2 による安全なブラウザベースの認証が可能ですが、従来の Datadog API キーを利用した API リクエストも可能です。
権限不足や Pup CLI コマンドが利用できない場合の代替手段として利用可能です。
API キー認証を利用する場合は下記の環境変数を設定します。
export DD_API_KEY="your-api-key"
export DD_APP_KEY="your-app-key"
export DD_SITE="datadoghq.com"
自然言語で Datadog を操作してみる
Claude Code を利用して会話してみます。
本検証ではモデルは Claude Opus 4.6 を利用しています。
ログイン
Pup CLI の OAuth2 を利用したログインを行ってみます。
Datadog API Claude プラグインを利用したいからログインして

一度ログイン済であったため、トークンのリフレッシュが行われました。
ログインしていない場合はpup auth loginコマンドが実行され、ブラウザベース認証が行われます。
モニター状態の確認
アラート状態のモニターは?

Pup CLI を利用してモニター状態を確認していることがわかります。
ログ検索
過去6時間のエラーログを表示して

こちらも同様に Pup CLI を利用してログ検索を行っています。
AI による分析と洞察も得られていますね。
モニター作成
このエラーログをモニタリングするモニターを作って

モニターが作成されました。
なお、現時点では Pup CLI コマンドによるモニター作成機能は提供されていません。
そのため、代替手段として従来の Datadog API リクエストによって作成がなされています。

インスタンス調査
i-XXXXXXXXXXXXXXX に関して調べて


Pup CLI コマンドと Datadog API を活用しながら調査結果のレポーティングを行っていることがわかります。
自然言語でコーディングしてみる
Python 言語でアプリケーションコードの作成を行ってみます。
コード生成
過去1時間のエラーログを照会して結果をcsvに出力する Python コードを生成して
⏺ 過去1時間のエラーログを取得してCSVに出力するPythonコードを生成します。まず、このプラグインのcode-generationスキルの詳細を確認します。
⏺ Read 1 file (ctrl+o to expand)
⎿ Loaded datadog-api-claude-plugin/CLAUDE.md
⏺ ログエージェントの詳細も確認して、最適なコードを生成します。
⏺ Read 1 file (ctrl+o to expand)
⏺ 完璧です!それでは、過去1時間のエラーログを検索してCSVに出力するPythonコードを生成します。
⏺ Write(search_error_logs.py)
⎿ Wrote 199 lines to search_error_logs.py
1 #!/usr/bin/env python3
2 """
3 Datadog Error Log Search and CSV Export
4
5 This script searches Datadog logs for errors in the last hour
6 and exports the results to a CSV file.
7
8 Requirements:
9 pip install datadog-api-client pandas
… +189 lines (ctrl+o to expand)
⏺ 次に、requirements.txtファイルと使い方を説明するREADMEも作成します。
⏺ Write(requirements.txt)
⎿ Wrote 3 lines to requirements.txt
1 datadog-api-client>=2.30.0
2 pandas>=2.0.0
⏺ Write(README.md)
⎿ Wrote 181 lines to README.md
1 # Datadog Error Log Search Script
2
3 過去1時間のエラーログをDatadog APIから検索し、CSVファイルに出力するPythonスクリプトです。
4
5 ## 機能
6
7 - Datadog Logs APIを使用してエラーログを検索
8 - 過去1時間(カスタマイズ可能)のログを取得
9 - 結果をCSVファイルに出力
10 - サービス別のエラー集計を表示
… +171 lines (ctrl+o to expand)
⏺ スクリプトを実行可能にします。
⏺ Bash(chmod +x search_error_logs.py)
⎿ Done
⏺ ✅ Pythonコードの生成が完了しました!
過去1時間のエラーログを検索してCSVに出力するPythonスクリプトを作成しました。
📁 作成したファイル
1. search_error_logs.py - メインスクリプト
- Datadog Logs APIでエラーログを検索
- 結果をCSVファイル(error_logs.csv)に出力
- サービス別のエラー集計を表示
2. requirements.txt - 依存パッケージ
3. README.md - 詳細な使い方ガイド
🚀 使い方
1. パッケージのインストール
cd /Users/shiina.yuichi/datadog-claude
pip install -r requirements.txt
2. 環境変数の設定(既に設定済みの場合はスキップ)
export DD_API_KEY="your-api-key"
export DD_APP_KEY="your-app-key"
export DD_SITE="datadoghq.com"
3. スクリプトの実行
python search_error_logs.py
または
./search_error_logs.py
📊 出力内容
スクリプトは以下を出力します:
- error_logs.csv - エラーログの詳細(タイムスタンプ、サービス、メッセージなど)
- コンソール出力 - エラー件数とサービス別の集計
⚙️ カスタマイズ方法
検索時間範囲を変更
スクリプト内のmain()関数を編集:
# 過去3時間のログを検索
logs = search_error_logs(hours=3, limit=1000)
検索条件を変更
search_error_logs()関数内のクエリを編集:
query="status:error service:api" # APIサービスのエラーのみ
query="status:error env:production" # 本番環境のみ
🔍 即座に結果を確認したい場合
スクリプトを実行せずに即座に確認したい場合は、pupコマンドを使用:
pup logs search --query="status:error" --from="1h" --to="now"
詳しい使い方はREADME.mdをご覧ください!
スクリプトコードと依存パッケージ、README.md が生成されました。
datadog-claude/
├── README.md # 使い方ガイド(日本語)
├── requirements.txt # 依存パッケージ (datadog-api-client)
├── search_error_logs.py # メインスクリプト
生成されたファイルを確認してみる
生成されたコードとドキュメントをそれぞれ確認してみます。
search_error_logs.py
#!/usr/bin/env python3
"""
Datadog エラーログ検索 → CSV出力スクリプト
過去1時間のエラーログを Datadog Logs API v2 で取得し、CSVファイルに書き出す。
ページネーション対応で、制限なく全件取得可能。
必要パッケージ:
pip install datadog-api-client
環境変数:
DD_API_KEY Datadog APIキー
DD_APP_KEY Datadog アプリケーションキー
DD_SITE Datadog サイト (デフォルト: datadoghq.com)
"""
import csv
import json
import os
import sys
from datetime import datetime, timedelta, timezone
from datadog_api_client import ApiClient, Configuration
from datadog_api_client.v2.api.logs_api import LogsApi
from datadog_api_client.v2.model.logs_list_request import LogsListRequest
from datadog_api_client.v2.model.logs_list_request_page import LogsListRequestPage
from datadog_api_client.v2.model.logs_query_filter import LogsQueryFilter
from datadog_api_client.v2.model.logs_sort import LogsSort
# ---------------------------------------------------------------------------
# 定数
# ---------------------------------------------------------------------------
DEFAULT_QUERY = "status:error"
DEFAULT_HOURS = 1
PAGE_LIMIT = 1000 # API 1リクエストあたり最大件数
MAX_PAGES = 50 # 安全策: 最大ページ数
OUTPUT_FILE = "error_logs.csv"
# CSVに出力する基本カラム(順序保証)
BASE_COLUMNS = [
"timestamp",
"status",
"service",
"host",
"message",
"tags",
]
# ---------------------------------------------------------------------------
# ヘルパー
# ---------------------------------------------------------------------------
def flatten_dict(d: dict, parent_key: str = "", sep: str = ".") -> dict:
"""ネストされた辞書をフラットなキーに展開する。
例: {"http": {"url": "/api", "status_code": 200}}
→ {"http.url": "/api", "http.status_code": 200}
"""
items: list[tuple[str, object]] = []
for k, v in d.items():
new_key = f"{parent_key}{sep}{k}" if parent_key else k
if isinstance(v, dict):
items.extend(flatten_dict(v, new_key, sep).items())
else:
items.append((new_key, v))
return dict(items)
def safe_str(value: object) -> str:
"""値を安全に文字列へ変換する。"""
if value is None:
return ""
if isinstance(value, (list, dict)):
return json.dumps(value, ensure_ascii=False, default=str)
return str(value)
# ---------------------------------------------------------------------------
# Datadog API 操作
# ---------------------------------------------------------------------------
def build_configuration() -> Configuration:
"""環境変数から Datadog API の Configuration を構築する。"""
api_key = os.getenv("DD_API_KEY")
app_key = os.getenv("DD_APP_KEY")
site = os.getenv("DD_SITE", "datadoghq.com")
if not api_key or not app_key:
print(
"エラー: DD_API_KEY と DD_APP_KEY の環境変数を設定してください。\n"
"\n"
" export DD_API_KEY='your-api-key'\n"
" export DD_APP_KEY='your-app-key'\n"
"\n"
"キーは Datadog > Organization Settings > API Keys / Application Keys\n"
"から取得できます。",
file=sys.stderr,
)
sys.exit(1)
cfg = Configuration()
cfg.api_key["apiKeyAuth"] = api_key
cfg.api_key["appKeyAuth"] = app_key
cfg.server_variables["site"] = site
return cfg
def fetch_error_logs(
query: str = DEFAULT_QUERY,
hours: int = DEFAULT_HOURS,
) -> list[dict]:
"""Datadog Logs API v2 でログを検索し、辞書のリストとして返す。
ページネーション (cursor) を自動処理して全件取得する。
"""
cfg = build_configuration()
now = datetime.now(timezone.utc)
from_time = now - timedelta(hours=hours)
with ApiClient(cfg) as client:
api = LogsApi(client)
all_logs: list[dict] = []
cursor: str | None = None
for page_num in range(1, MAX_PAGES + 1):
page = LogsListRequestPage(limit=PAGE_LIMIT)
if cursor:
page.cursor = cursor
body = LogsListRequest(
filter=LogsQueryFilter(
query=query,
_from=from_time.isoformat(),
to=now.isoformat(),
),
sort=LogsSort.TIMESTAMP_ASCENDING,
page=page,
)
resp = api.list_logs(body=body)
if not resp.data:
break
for log in resp.data:
attrs = log.attributes
row: dict[str, str] = {
"timestamp": safe_str(
getattr(attrs, "timestamp", "")
),
"status": safe_str(getattr(attrs, "status", "")),
"service": safe_str(getattr(attrs, "service", "")),
"host": safe_str(getattr(attrs, "host", "")),
"message": safe_str(getattr(attrs, "message", "")),
"tags": ",".join(getattr(attrs, "tags", []) or []),
}
# カスタム属性をフラットに展開して追加
custom = getattr(attrs, "attributes", None)
if custom and isinstance(custom, dict):
for k, v in flatten_dict(custom).items():
row[k] = safe_str(v)
all_logs.append(row)
print(
f" ページ {page_num}: {len(resp.data)} 件取得 "
f"(累計 {len(all_logs)} 件)"
)
# 次ページの cursor を取得
cursor = None
if resp.meta and hasattr(resp.meta, "page"):
cursor = getattr(resp.meta.page, "after", None)
if not cursor:
break
return all_logs
# ---------------------------------------------------------------------------
# CSV 出力
# ---------------------------------------------------------------------------
def write_csv(logs: list[dict], path: str = OUTPUT_FILE) -> None:
"""ログリストを CSV ファイルに書き出す。"""
if not logs:
print("出力するログがありません。", file=sys.stderr)
return
# 全ログから出現するカラム名を収集し、基本カラムを先頭に固定
extra_cols = sorted(
{k for row in logs for k in row if k not in BASE_COLUMNS}
)
fieldnames = BASE_COLUMNS + extra_cols
with open(path, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(
f,
fieldnames=fieldnames,
extrasaction="ignore",
)
writer.writeheader()
writer.writerows(logs)
print(f"\n✅ {len(logs)} 件のログを {path} に出力しました。")
# ---------------------------------------------------------------------------
# サマリー表示
# ---------------------------------------------------------------------------
def print_summary(logs: list[dict]) -> None:
"""サービス別のエラー件数を表示する。"""
if not logs:
return
services: dict[str, int] = {}
for row in logs:
svc = row.get("service") or "(unknown)"
services[svc] = services.get(svc, 0) + 1
print(f"\n{'='*40}")
print(f" エラーログ サマリー")
print(f"{'='*40}")
print(f" 合計: {len(logs)} 件")
print(f"\n サービス別内訳:")
for svc, cnt in sorted(services.items(), key=lambda x: -x[1]):
print(f" {svc}: {cnt} 件")
print(f"{'='*40}")
# ---------------------------------------------------------------------------
# メイン
# ---------------------------------------------------------------------------
def main() -> int:
query = DEFAULT_QUERY
hours = DEFAULT_HOURS
now = datetime.now(timezone.utc)
from_time = now - timedelta(hours=hours)
print(f"🔍 Datadog ログ検索")
print(f" クエリ : {query}")
print(f" 期間 : {from_time:%Y-%m-%d %H:%M:%S} UTC → {now:%Y-%m-%d %H:%M:%S} UTC")
print()
try:
logs = fetch_error_logs(query=query, hours=hours)
except Exception as e:
print(f"❌ ログ取得に失敗しました: {e}", file=sys.stderr)
return 1
write_csv(logs, OUTPUT_FILE)
print_summary(logs)
return 0
if __name__ == "__main__":
sys.exit(main())
README.md
# Datadog エラーログ検索 → CSV出力
過去1時間のエラーログを Datadog Logs API v2 で取得し、CSVファイルに書き出す Python スクリプトです。
## 機能
- Datadog Logs API v2 を使用したエラーログ検索
- カーソルベースのページネーション対応(全件自動取得)
- ネストされたカスタム属性をフラットに展開してCSVカラム化
- サービス別エラー件数のサマリー表示
## 前提条件
- Python 3.10 以上
- Datadog アカウント(APIキー・アプリケーションキー)
## セットアップ
### 1. 依存パッケージのインストール
\```bash
pip install -r requirements.txt
\```
### 2. 環境変数の設定
\```bash
export DD_API_KEY="your-datadog-api-key"
export DD_APP_KEY="your-datadog-application-key"
export DD_SITE="datadoghq.com" # オプション(デフォルト: datadoghq.com)
\```
キーの取得先: Datadog > Organization Settings > **API Keys** / **Application Keys**
## 使い方
\```bash
python search_error_logs.py
\```
実行すると `error_logs.csv` が生成されます。
### 出力例
\```
🔍 Datadog ログ検索
クエリ : status:error
期間 : 2026-02-13 08:00:00 UTC → 2026-02-13 09:00:00 UTC
ページ 1: 142 件取得 (累計 142 件)
✅ 142 件のログを error_logs.csv に出力しました。
========================================
エラーログ サマリー
========================================
合計: 142 件
サービス別内訳:
api: 68 件
web-app: 45 件
worker: 29 件
========================================
\```
### CSV カラム
| カラム | 説明 |
|--------|------|
| `timestamp` | ログのタイムスタンプ |
| `status` | ログレベル(error) |
| `service` | サービス名 |
| `host` | ホスト名 |
| `message` | ログメッセージ |
| `tags` | タグ(カンマ区切り) |
| *(動的カラム)* | カスタム属性がフラットに展開される(例: `http.status_code`, `error.kind`) |
## カスタマイズ
スクリプト冒頭の定数を編集して動作を変更できます。
\```python
DEFAULT_QUERY = "status:error" # 検索クエリ
DEFAULT_HOURS = 1 # 検索期間(時間)
PAGE_LIMIT = 1000 # 1ページあたりの取得件数
MAX_PAGES = 50 # 最大ページ数
OUTPUT_FILE = "error_logs.csv" # 出力ファイル名
\```
### クエリ例
\```python
# 特定サービスのエラー
DEFAULT_QUERY = "status:error service:api"
# 本番環境のみ
DEFAULT_QUERY = "status:error env:production"
# HTTP 5xx エラーのみ
DEFAULT_QUERY = "status:error @http.status_code:>=500"
# 複合条件
DEFAULT_QUERY = "status:error service:api env:production @http.method:POST"
\```
## pup CLI での即時確認
Python スクリプトを使わずに、OAuth認証済みの `pup` CLI で直接確認することもできます。
\```bash
# エラーログを検索
pup logs search --query="status:error" --from="1h" --to="now"
# テーブル形式で表示
pup logs search --query="status:error" --from="1h" --to="now" --output=table
\```
## トラブルシューティング
| エラー | 対処 |
|--------|------|
| `DD_API_KEY と DD_APP_KEY の環境変数を設定してください` | 環境変数が未設定。`export DD_API_KEY=...` で設定する |
| `403 Forbidden` | APIキーの権限不足。Logs Read 権限があるか確認する |
| `429 Rate Limit` | API呼び出し上限。しばらく待つか検索範囲を狭める |
| ログが0件 | 時間範囲を広げる (`DEFAULT_HOURS`)、またはクエリ条件を緩和する |
## ライセンス
Apache License 2.0
requirements.txt
datadog-api-client>=2.30.0
スクリプトを実行してみる
生成されたスクリプトコードを実行してみます。
python3 search_error_logs.py
🔍 Datadog ログ検索
クエリ : status:error
期間 : 2026-02-11 20:47:18 UTC → 2026-02-13 08:47:18 UTC
ページ 1: 2 件取得 (累計 2 件)
✅ 2 件のログを error_logs.csv に出力しました。
========================================
エラーログ サマリー
========================================
合計: 2 件
サービス別内訳:
webserver: 2 件
========================================
```csv:error_logs.csv
timestamp,status,service,host,message,tags,date_access,error.message,http.method,http.url,http.url_details.path,http.version,level,network.ip.attributes,network.ip.list,request,server
2026-02-12 04:32:59+00:00,error,webserver,localhost,"2026/02/12 04:32:59 [error] 2224#2224: *2 open() ""/usr/share/nginx/html/admin.php"" failed (2: No such file or directory), client: ::1, server: _, request: ""GET /admin.php? HTTP/1.1"", host: ""localhost""","availability-zone:ap-northeast-1a,aws_account:XXXXXXXXXXXX,cloud_provider:aws,datadog.api_key_uuid:XXXXXXXXXX,datadog.submission_auth:api_key,dirname:/var/log/nginx,filename:error.log,iam_profile:ec2-role,image:ami-XXXXXXXXXX,instance-type:t2.micro,kernel:none,name:nginx1,region:ap-northeast-1,security-group:sg-XXXXXXXXXX,service:webserver,source:nginx",1770870779000.0,"2224#2224: *2 open() ""/usr/share/nginx/html/admin.php"" failed (2: No such file or directory)",GET,/admin.php?,/admin.php,1.1,error,"[{""ip"": ""::1"", ""source"": [""message""]}]","[""::1""]",GET /admin.php? HTTP/1.1,_
2026-02-12 04:33:07+00:00,error,webserver,localhost,"2026/02/12 04:33:07 [error] 2224#2224: *3 open() ""/usr/share/nginx/html/admin.html"" failed (2: No such file or directory), client: ::1, server: _, request: ""GET /admin.html HTTP/1.1"", host: ""localhost""","availability-zone:ap-northeast-1a,aws_account:XXXXXXXXXXXX,cloud_provider:aws,datadog.api_key_uuid:XXXXXXXXXX,datadog.submission_auth:api_key,dirname:/var/log/nginx,filename:error.log,iam_profile:ec2-role,image:ami-XXXXXXXXXX,instance-type:t2.micro,kernel:none,name:nginx1,region:ap-northeast-1,security-group:sg-XXXXXXXXXX,service:webserver,source:nginx",1770870787000.0,"2224#2224: *3 open() ""/usr/share/nginx/html/admin.html"" failed (2: No such file or directory)",GET,/admin.html,/admin.html,1.1,error,"[{""ip"": ""::1"", ""source"": [""message""]}]","[""::1""]",GET /admin.html HTTP/1.1,_
しっかり動作しました。
SKILL.md のベストプラクティスに沿っているか確認してみる
生成されたコードやドキュメントがベストプラクティスに沿っているか、いくつか確認してみます。
- 公式APIクライアント使用
datadog-api-client (Python) の v2 API を使用しています。
from datadog_api_client import ApiClient, Configuration
from datadog_api_client.v2.api.logs_api import LogsApi
from datadog_api_client.v2.model.logs_list_request import LogsListRequest
- 認証設定
3つの環境変数からキー・サイトを取得し、コードにシークレットをハードコードしない設計です。
api_key = os.getenv("DD_API_KEY")
app_key = os.getenv("DD_APP_KEY")
site = os.getenv("DD_SITE", "datadoghq.com")
cfg = Configuration()
cfg.api_key["apiKeyAuth"] = api_key
cfg.api_key["appKeyAuth"] = app_key
cfg.server_variables["site"] = site
- エラーハンドリング
認証不備は早期終了し、API 例外は包括的にキャッチ、無限ループは MAX_PAGES で上限を設けています。
if not api_key or not app_key:
print("エラー: DD_API_KEY と DD_APP_KEY の環境変数を設定してください。", file=sys.stderr)
sys.exit(1)
try:
logs = fetch_error_logs(query=query, hours=hours)
except Exception as e:
print(f"❌ ログ取得に失敗しました: {e}", file=sys.stderr)
return 1
MAX_PAGES = 50
for page_num in range(1, MAX_PAGES + 1):
if not resp.data:
break
if not cursor:
break
- 例の提示
出力、クエリ、トラブルシューティングの例が示されています。
### 出力例
\```
🔍 Datadog ログ検索
クエリ : status:error
期間 : 2026-02-13 08:00:00 UTC → 2026-02-13 09:00:00 UTC
ページ 1: 142 件取得 (累計 142 件)
✅ 142 件のログを error_logs.csv に出力しました。
========================================
エラーログ サマリー
========================================
合計: 142 件
サービス別内訳:
api: 68 件
web-app: 45 件
worker: 29 件
========================================
\```
### クエリ例
\```python
# 特定サービスのエラー
DEFAULT_QUERY = "status:error service:api"
# 本番環境のみ
DEFAULT_QUERY = "status:error env:production"
# HTTP 5xx エラーのみ
DEFAULT_QUERY = "status:error @http.status_code:>=500"
# 複合条件
DEFAULT_QUERY = "status:error service:api env:production @http.method:POST"
\```
## トラブルシューティング
| エラー | 対処 |
|--------|------|
| `DD_API_KEY と DD_APP_KEY の環境変数を設定してください` | 環境変数が未設定。`export DD_API_KEY=...` で設定する |
| `403 Forbidden` | APIキーの権限不足。Logs Read 権限があるか確認する |
| `429 Rate Limit` | API呼び出し上限。しばらく待つか検索範囲を狭める |
| ログが0件 | 時間範囲を広げる (`DEFAULT_HOURS`)、またはクエリ条件を緩和する |
- クイックテスト用のpupと統合用のコードについて言及
Pup CLI コマンドについて言及されています。
## pup CLI での即時確認
Python スクリプトを使わずに、OAuth認証済みの `pup` CLI で直接確認することもできます。
\```bash
# エラーログを検索
pup logs search --query="status:error" --from="1h" --to="now"
# テーブル形式で表示
pup logs search --query="status:error" --from="1h" --to="now" --output=table
\```
全体的に Skill.md に指示されたベストプラクティスに従ったコードと README.md が生成されていることがわかります。
まとめ
Datadog 公式の Claude Code プラグイン「datadog-api-claude-plugin」を使って、自然言語によるログ検索・モニター作成・インスタンス調査・コード生成を一通り試してみました。
MCP サーバ不要で Pup CLI を介して直接連携するシンプルな構成のため、導入ハードルが低く、すぐに試せるのが大きな魅力です。
46個の専門エージェントが状況に応じて適切に振り分けられるため、Datadog の専門知識が浅くても自然言語で高度な操作や調査が行えました。
公式 MCP サーバの一般提供を待ちきれない方は、ぜひこのプラグインを試してみてください。
本記事が参考になれば幸いです。
参考









