一键导入
signoz-observability
Guia completo de observabilidade com SignOz — instrumentação, rastreamento distribuído, métricas e logs. Quando usar e quando não usar.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Guia completo de observabilidade com SignOz — instrumentação, rastreamento distribuído, métricas e logs. Quando usar e quando não usar.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | signoz-observability |
| description | Guia completo de observabilidade com SignOz — instrumentação, rastreamento distribuído, métricas e logs. Quando usar e quando não usar. |
Referência para integração e uso de SignOz (Open-source observability stack) em projetos CappyCloud. Use quando precisar implementar observabilidade de ponta a ponta: traces distribuídos, métricas de aplicação, logs estruturados.
SignOz é um stack de observabilidade open-source que coleta e visualiza:
Usa OpenTelemetry como padrão — coleta agnóstica a stack (suporta Python, Node.js, Go, Java, etc).
| Cenário | Razão | Prioridade |
|---|---|---|
| Serviço em produção | Debugar problemas em tempo real sem SSH | 🔴 Alta |
| Arquitetura de microserviços | Entender latência entre serviços | 🔴 Alta |
| Pipeline de agentes | Rastrear execução de tasks e sub-tasks | 🔴 Alta |
| Integração gRPC/API | Debugar chamadas lentas/falhadas | 🟡 Média |
| Investigação de performance | Identificar gargalos sem profiler | 🟡 Média |
| Desenvolvimento local com Docker | Debugar comportamento de container | 🟢 Baixa |
# ✅ USE SignOz aqui:
# - Serviço FastAPI em produção
# - Precisa debugar por que um endpoint está lento
# - Quer ver o trace completo: HTTP → banco de dados → redis → chamada gRPC
from opentelemetry import trace, metrics
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
# Setup tracer
trace_exporter = OTLPSpanExporter(
endpoint="signoz:4317", # gRPC endpoint
insecure=True
)
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(
BatchSpanProcessor(trace_exporter)
)
| Condição | Razão | Alternativa |
|---|---|---|
| ❌ service.name não configurado | SignOz precisa identificar qual serviço gera o trace — sem nome, é impossível filtrar no UI | Configure OTEL_SERVICE_NAME primeiro |
| ❌ Variáveis de ambiente OTEL não definidas | OpenTelemetry não sabe para onde enviar spans | Configure .env ou docker-compose antes |
| ❌ Servidor SignOz indisponível | Spans serão perdidos ou acumularão em buffer | Verifique se docker-compose está rodando |
| ❌ Desenvolvimento local sem Docker | Difícil conectar ao servidor SignOz remoto | Use localhost:4317 ou suba SignOz localmente |
| ❌ Script one-off / job pontual | Overhead de instrumentação > valor (traces curtos) | Use print() ou logging simples |
| ❌ Ambiente restrito (sem gRPC) | Firewall/proxy bloqueia porta 4317 | Use exportador HTTP em porta 4318 |
# ❌ NÃO USE SignOz aqui:
# 1. Script sem service.name
if not os.getenv("OTEL_SERVICE_NAME"):
print("⚠️ OTEL_SERVICE_NAME não está definida!")
print(" Instrumentação desativada — use print() ou logging")
# Alternativa: logging.basicConfig() + print()
# 2. Job que roda 50ms — overhead não compensa
@app.get("/health")
def health_check():
# Instrumentação aqui seria overkill
return {"status": "ok"}
# 3. Desenvolvimento local sem Docker
if os.getenv("ENV") == "development" and not docker_is_running():
print("❌ SignOz não está rodando")
print(" Inicie: docker-compose -f docker-compose.dev.yml up")
# .env ou docker-compose.yml
OTEL_EXPORTER_OTLP_ENDPOINT=http://signoz:4317 # gRPC
OTEL_EXPORTER_OTLP_PROTOCOL=grpc
OTEL_SERVICE_NAME=my-service # ⚠️ CRÍTICO
OTEL_ENVIRONMENT=production
OTEL_RESOURCE_ATTRIBUTES=service.version=1.0.0,deployment.environment=prod
# docker-compose.dev.yml
services:
signoz:
image: signoz/signoz:latest
ports:
- "3301:3301" # Web UI
environment:
- CLICKHOUSE_CLUSTER=cluster_0
depends_on:
- clickhouse
clickhouse:
image: clickhouse/clickhouse-server:latest
environment:
- CLICKHOUSE_DB=signoz_db
ports:
- "9000:9000"
volumes:
- clickhouse_data:/var/lib/clickhouse
volumes:
clickhouse_data:
# app/main.py
from opentelemetry import trace, metrics
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
from opentelemetry.instrumentation.requests import RequestsInstrumentor
from fastapi import FastAPI
import os
app = FastAPI()
# Validar service.name
service_name = os.getenv("OTEL_SERVICE_NAME")
if not service_name:
raise ValueError("⚠️ OTEL_SERVICE_NAME deve estar configurada!")
# Setup Tracer Provider
trace_exporter = OTLPSpanExporter(
endpoint=os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317"),
insecure=True
)
tracer_provider = TracerProvider(resource=Resource.create({
"service.name": service_name,
"service.version": "1.0.0"
}))
tracer_provider.add_span_processor(BatchSpanProcessor(trace_exporter))
trace.set_tracer_provider(tracer_provider)
# Setup Meter Provider (métricas)
metric_exporter = OTLPMetricExporter(
endpoint=os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317"),
insecure=True
)
metric_reader = PeriodicExportingMetricReader(metric_exporter)
meter_provider = MeterProvider(metric_readers=[metric_reader])
metrics.set_meter_provider(meter_provider)
# Auto-instrumentar componentes
FastAPIInstrumentor.instrument_app(app)
SQLAlchemyInstrumentor().instrument()
RequestsInstrumentor().instrument()
from opentelemetry import trace
tracer = trace.get_tracer(__name__)
# Criar span manualmente
def process_order(order_id: str):
with tracer.start_as_current_span("process_order") as span:
span.set_attribute("order.id", order_id)
span.set_attribute("order.status", "processing")
# Código aqui será rastreado
result = calculate_total(order_id)
span.set_attribute("order.total", result)
return result
# Atributos no request (útil para correlacionar traces)
@app.middleware("http")
async def add_trace_context(request: Request, call_next):
request_id = request.headers.get("X-Request-ID", str(uuid.uuid4()))
# Adicionar ao trace
span = trace.get_current_span()
span.set_attribute("request.id", request_id)
span.set_attribute("request.method", request.method)
span.set_attribute("request.path", request.url.path)
response = await call_next(request)
span.set_attribute("response.status", response.status_code)
return response
from opentelemetry.trace import Status, StatusCode
try:
# Código que pode falhar
result = api.fetch_data()
except Exception as e:
span = trace.get_current_span()
span.record_exception(e)
span.set_status(Status(StatusCode.ERROR))
raise
URL: http://localhost:3301
# Buscar por service.name
service.name = "my-service"
# Buscar by erro
status.code = "ERROR"
# Buscar por latência > 1s
duration > 1000ms
# Buscar por operação específica
operation_name = "GET /api/users"
# Combinar: traces com erro que demoraram > 500ms
status.code = "ERROR" AND duration > 500ms
-- Latência percentil P95 por endpoint
SELECT
quantile(0.95)(duration_ms) as p95_latency,
http_method,
http_url
FROM traces
WHERE service_name = 'my-service'
GROUP BY http_method, http_url
-- Taxa de erro por serviço
SELECT
COUNT(*) as total_spans,
countIf(status_code = 'ERROR') as error_count,
(error_count / total_spans * 100) as error_rate_pct
FROM traces
WHERE timestamp > now() - INTERVAL 1 HOUR
GROUP BY service_name
Checklist:
# 1. Verificar variáveis de ambiente
echo $OTEL_SERVICE_NAME # Deve não estar vazio
echo $OTEL_EXPORTER_OTLP_ENDPOINT # Deve apontar para SignOz
# 2. Verificar conectividade
curl -X POST http://signoz:4317/some-path
# Deve falhar com "connection refused" se SignOz está down
# 3. Verificar logs do container
docker logs <container-id> | grep -i "otel\|trace"
# 4. Forçar verbose logging
OTEL_LOG_LEVEL=debug python app/main.py
Solução:
# Ensure Resource está configurado corretamente
from opentelemetry.sdk.resources import Resource
resource = Resource.create({
"service.name": os.getenv("OTEL_SERVICE_NAME"),
"service.version": "1.0.0",
"environment": os.getenv("OTEL_ENVIRONMENT", "dev"),
"deployment.environment": os.getenv("OTEL_ENVIRONMENT", "dev")
})
tracer_provider = TracerProvider(resource=resource)
Dicas:
# 1. Ajustar batch size
BatchSpanProcessor(exporter, schedule_delay_millis=5000, max_queue_size=512)
# 2. Usar sampler para reduzir volume
from opentelemetry.sdk.trace.sampling import TraceIdRatioBased
trace.set_tracer_provider(TracerProvider(
sampler=TraceIdRatioBased(0.1) # Coletar 10% dos traces
))
# 3. Desabilitar em ambientes com baixa relevância
if os.getenv("ENV") not in ["production", "staging"]:
# Usar NoOpSpanProcessor (descarta traces)
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
tracer_provider.add_span_processor(SimpleSpanProcessor(InMemorySpanExporter()))
OTEL_SERVICE_NAME está definido em .env e docker-compose.ymldocker ps | grep signoz)pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlppip install opentelemetry-instrumentation-fastapi opentelemetry-instrumentation-sqlalchemyFastAPIInstrumentor.instrument_app(app))localhost:3301Scope: Global — aplicável a todos os serviços Última atualização: maio 2026
Realiza revisão de código técnica, usar está habilidade quando precisar fazer revisão de código, verificar conformidade com padrões arquiteturais (Hexagonal), qualidade de código, performance e corretude lógica.
Use esta habilidade para gerar ou evoluir o design system do CappyCloud - tokens, paletas, tipografia, espacamentos e padroes de componentes.
Use esta habilidade quando precisar implementar interfaces e componentes no frontend do CappyCloud. O padrao legado e React 19 + Mantine 9, mas features com Spec Kit aprovado podem adotar outro design system, como shadcn/ui + Tailwind.
Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation.
Generate a custom checklist for the current feature based on user requirements.
Execute the implementation plan by processing and executing all tasks defined in tasks.md