zipkin
分散トレーシングツールZipkinを導入し、リクエストの流れを可視化することで、システムのボトルネック特定やサービス間の依存関係分析、トレースデータの保存設定などを効率的に行うSkill。
📜 元の英語説明(参考)
Deploy and configure Zipkin for distributed tracing and request flow visualization. Use when a user needs to set up trace collection, instrument Java/Spring or other services with Zipkin, analyze service dependencies, or configure storage backends for trace data.
🇯🇵 日本人クリエイター向け解説
分散トレーシングツールZipkinを導入し、リクエストの流れを可視化することで、システムのボトルネック特定やサービス間の依存関係分析、トレースデータの保存設定などを効率的に行うSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o zipkin.zip https://jpskill.com/download/15592.zip && unzip -o zipkin.zip && rm zipkin.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15592.zip -OutFile "$d\zipkin.zip"; Expand-Archive "$d\zipkin.zip" -DestinationPath $d -Force; ri "$d\zipkin.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
zipkin.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
zipkinフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Zipkin
概要
分散トレーシングのために Zipkin をセットアップし、サービス間のリクエストフローを可視化します。デプロイ、Spring Boot と OpenTelemetry による計測、ストレージ構成、依存関係分析について説明します。
手順
タスク A: Zipkin のデプロイ
# docker-compose.yml — Elasticsearch ストレージを使用する Zipkin
services:
zipkin:
image: openzipkin/zipkin:3
environment:
- STORAGE_TYPE=elasticsearch
- ES_HOSTS=http://elasticsearch:9200
- ES_INDEX=zipkin
- ES_INDEX_REPLICAS=1
- ES_INDEX_SHARDS=3
- SELF_TRACING_ENABLED=true
- JAVA_OPTS=-Xms512m -Xmx512m
ports:
- "9411:9411"
depends_on:
- elasticsearch
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
volumes:
- es_data:/usr/share/elasticsearch/data
volumes:
es_data:
# インメモリストレージを使用したクイックスタート (開発環境のみ)
docker run -d -p 9411:9411 openzipkin/zipkin:3
タスク B: Spring Boot アプリケーションの計測
<!-- pom.xml — Spring Boot 3 用の Zipkin 依存関係 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
# application.yml — Spring Boot トレーシング構成
spring:
application:
name: order-service
management:
tracing:
sampling:
probability: 1.0
zipkin:
tracing:
endpoint: http://zipkin:9411/api/v2/spans
logging:
pattern:
level: "%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]"
// OrderController.java — 自動トレーシングを行う Spring Boot コントローラ
@RestController
@RequestMapping("/api/orders")
public class OrderController {
private final RestClient restClient;
private final ObservationRegistry registry;
@PostMapping
public ResponseEntity<Order> createOrder(@RequestBody OrderRequest req) {
// @RestController メソッドに対してスパンが自動的に作成されます
Order order = orderService.create(req);
// RestClient はトレースコンテキストを自動的に伝播します
PaymentResult payment = restClient.post()
.uri("http://payment-service/api/charge")
.body(new ChargeRequest(order.getId(), order.getTotal()))
.retrieve()
.body(PaymentResult.class);
return ResponseEntity.status(201).body(order);
}
}
タスク C: OpenTelemetry による計測 (汎用)
# tracing.py — OTLP 経由で Zipkin にトレースを送信する Python サービス
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.zipkin.json import ZipkinExporter
from opentelemetry.sdk.resources import Resource
resource = Resource.create({"service.name": "inventory-service"})
provider = TracerProvider(resource=resource)
zipkin_exporter = ZipkinExporter(endpoint="http://zipkin:9411/api/v2/spans")
provider.add_span_processor(BatchSpanProcessor(zipkin_exporter))
trace.set_tracer_provider(provider)
tracer = trace.get_tracer("inventory-service")
// tracing.js — Zipkin にトレースを送信する Node.js サービス
const { NodeSDK } = require('@opentelemetry/sdk-node')
const { ZipkinExporter } = require('@opentelemetry/exporter-zipkin')
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node')
const sdk = new NodeSDK({
traceExporter: new ZipkinExporter({ url: 'http://zipkin:9411/api/v2/spans' }),
instrumentations: [getNodeAutoInstrumentations()],
serviceName: 'notification-service',
})
sdk.start()
タスク D: API 経由でのトレースのクエリ
# サービス名と時間範囲でトレースを検索
curl -s "http://localhost:9411/api/v2/traces?serviceName=order-service&limit=10&lookback=3600000" | \
jq '.[] | {traceId: .[0].traceId, spans: length, root: .[0].name, duration: (.[0].duration / 1000)}'
# サービス依存関係グラフを取得
curl -s "http://localhost:9411/api/v2/dependencies?endTs=$(date +%s000)&lookback=86400000" | \
jq '.[] | "\(.parent) -> \(.child) (\(.callCount) calls)"'
# 特定のタグを持つトレースを検索
curl -s "http://localhost:9411/api/v2/traces?annotationQuery=http.status_code%3D500&serviceName=order-service" | \
jq '.[0][] | {name: .name, service: .localEndpoint.serviceName, duration: .duration}'
タスク E: MySQL ストレージを使用する Zipkin
# docker-compose.yml — 永続ストレージ用の MySQL を使用する Zipkin
services:
zipkin:
image: openzipkin/zipkin:3
environment:
- STORAGE_TYPE=mysql
- MYSQL_HOST=mysql
- MYSQL_TCP_PORT=3306
- MYSQL_USER=zipkin
- MYSQL_PASS=zipkin_password
ports:
- "9411:9411"
depends_on:
- mysql
mysql:
image: openzipkin/zipkin-mysql:3
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
ベストプラクティス
- ストレージコストを制御するために、トラフィックの多い本番環境サービスでは 100% 未満のサンプリングレートを使用します
- ログとトレースの相関関係のために、アプリケーションログにトレース ID を含めます
- Spring Boot でのサービス間コンテキスト伝播には、B3 伝播ヘッダーを使用します
- 適切なストレージ TTL を設定します — 詳細なトレースには 7 日間、依存関係データは軽量です
/healthエンドポイントとSELF_TRACING_ENABLED=trueで Zipkin 自身のヘルスを監視します- 高いトレースボリュームの本番環境ワークロードには、MySQL よりも Elasticsearch を優先します
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Zipkin
Overview
Set up Zipkin for distributed tracing to visualize request flows across services. Covers deployment, instrumentation with Spring Boot and OpenTelemetry, storage configuration, and dependency analysis.
Instructions
Task A: Deploy Zipkin
# docker-compose.yml — Zipkin with Elasticsearch storage
services:
zipkin:
image: openzipkin/zipkin:3
environment:
- STORAGE_TYPE=elasticsearch
- ES_HOSTS=http://elasticsearch:9200
- ES_INDEX=zipkin
- ES_INDEX_REPLICAS=1
- ES_INDEX_SHARDS=3
- SELF_TRACING_ENABLED=true
- JAVA_OPTS=-Xms512m -Xmx512m
ports:
- "9411:9411"
depends_on:
- elasticsearch
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
volumes:
- es_data:/usr/share/elasticsearch/data
volumes:
es_data:
# Quick start with in-memory storage (development only)
docker run -d -p 9411:9411 openzipkin/zipkin:3
Task B: Instrument Spring Boot Application
<!-- pom.xml — Zipkin dependencies for Spring Boot 3 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
# application.yml — Spring Boot tracing configuration
spring:
application:
name: order-service
management:
tracing:
sampling:
probability: 1.0
zipkin:
tracing:
endpoint: http://zipkin:9411/api/v2/spans
logging:
pattern:
level: "%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]"
// OrderController.java — Spring Boot controller with automatic tracing
@RestController
@RequestMapping("/api/orders")
public class OrderController {
private final RestClient restClient;
private final ObservationRegistry registry;
@PostMapping
public ResponseEntity<Order> createOrder(@RequestBody OrderRequest req) {
// Spans are created automatically for @RestController methods
Order order = orderService.create(req);
// RestClient propagates trace context automatically
PaymentResult payment = restClient.post()
.uri("http://payment-service/api/charge")
.body(new ChargeRequest(order.getId(), order.getTotal()))
.retrieve()
.body(PaymentResult.class);
return ResponseEntity.status(201).body(order);
}
}
Task C: Instrument with OpenTelemetry (Generic)
# tracing.py — Python service sending traces to Zipkin via OTLP
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.zipkin.json import ZipkinExporter
from opentelemetry.sdk.resources import Resource
resource = Resource.create({"service.name": "inventory-service"})
provider = TracerProvider(resource=resource)
zipkin_exporter = ZipkinExporter(endpoint="http://zipkin:9411/api/v2/spans")
provider.add_span_processor(BatchSpanProcessor(zipkin_exporter))
trace.set_tracer_provider(provider)
tracer = trace.get_tracer("inventory-service")
// tracing.js — Node.js service sending traces to Zipkin
const { NodeSDK } = require('@opentelemetry/sdk-node')
const { ZipkinExporter } = require('@opentelemetry/exporter-zipkin')
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node')
const sdk = new NodeSDK({
traceExporter: new ZipkinExporter({ url: 'http://zipkin:9411/api/v2/spans' }),
instrumentations: [getNodeAutoInstrumentations()],
serviceName: 'notification-service',
})
sdk.start()
Task D: Query Traces via API
# Find traces by service name and time range
curl -s "http://localhost:9411/api/v2/traces?serviceName=order-service&limit=10&lookback=3600000" | \
jq '.[] | {traceId: .[0].traceId, spans: length, root: .[0].name, duration: (.[0].duration / 1000)}'
# Get service dependency graph
curl -s "http://localhost:9411/api/v2/dependencies?endTs=$(date +%s000)&lookback=86400000" | \
jq '.[] | "\(.parent) -> \(.child) (\(.callCount) calls)"'
# Find traces with specific tag
curl -s "http://localhost:9411/api/v2/traces?annotationQuery=http.status_code%3D500&serviceName=order-service" | \
jq '.[0][] | {name: .name, service: .localEndpoint.serviceName, duration: .duration}'
Task E: Zipkin with MySQL Storage
# docker-compose.yml — Zipkin with MySQL for durable storage
services:
zipkin:
image: openzipkin/zipkin:3
environment:
- STORAGE_TYPE=mysql
- MYSQL_HOST=mysql
- MYSQL_TCP_PORT=3306
- MYSQL_USER=zipkin
- MYSQL_PASS=zipkin_password
ports:
- "9411:9411"
depends_on:
- mysql
mysql:
image: openzipkin/zipkin-mysql:3
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
Best Practices
- Use sampling rates below 100% in production for high-traffic services to control storage costs
- Include trace IDs in application logs for log-trace correlation
- Use B3 propagation headers for cross-service context propagation in Spring Boot
- Set appropriate storage TTL — 7 days for detailed traces, dependency data is lightweight
- Monitor Zipkin's own health with
/healthendpoint andSELF_TRACING_ENABLED=true - Prefer Elasticsearch over MySQL for production workloads with high trace volume