Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/ffsshhttiikk/opencode-agents-skills --skill observability명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | observability |
| description | System observability and monitoring |
| license | MIT |
| compatibility | opencode |
| metadata | {"audience":"developer, devops-engineer, sre","category":"devops"} |
Metrics: Quantitative measurements over time
Logs: Discrete events with context
Traces: Request paths through systems
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
# Setup tracing
provider = TracerProvider()
processor = BatchSpanProcessor(
JaegerExporter(
agent_host_name="jaeger",
agent_port=6831,
)
)
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
# Create spans
@tracer.start_as_current_span("process_order")
def process_order(order_id):
with tracer.start_as_current_span("validate") as span:
span.set_attribute("order.id", order_id)
validate_order(order_id)
with tracer.start_as_current_span("charge") as span:
charge_customer(order_id)
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
rule_files:
- "alerts/*.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
{
"dashboard": {
"title": "Service Dashboard",
"panels": [
{
"title": "Request Rate",
"type": "graph",
"targets": [
{
"expr": "sum(rate(http_requests_total[5m])) by (service)",
"legendFormat": "{{service}}"
}
]
},
{
"title": "Error Rate",
"type": "graph",
"targets": [
{
"expr": "sum(rate(http_requests_total{status=~\"5..\"}[5m])) by (service) / sum(rate(http_requests_total[5m])) by (service)",
"legendFormat"
# Service Level Indicators
slis:
- name: availability
type: ratio
description: "Successful requests / Total requests"
source: prometheus
query: |
sum(rate(http_requests_total{status!~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
- name: latency
type: threshold
description: "P99 latency"
source: prometheus
query: |
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket[5m])) by (le)
)
# Service Level Objectives
slo:
- name: api-availability
sli: availability
target: 99.9
window: 30d
error_budget:
alerts:
- name: ErrorBudgetWarning
threshold: 0.05
- name: ErrorBudgetCritical
threshold: 0.01
// Jaeger client integration
const jaegerConfig = {
serviceName: 'order-service',
reporter: {
logSpans: true,
agentHost: 'jaeger',
agentPort: 6831,
},
sampler: {
type: 'const',
param: 1,
},
};
const tracer = initJaeger(jaegerConfig);
// Add to HTTP requests
app.use((req, res, next) => {
const span = tracer.startSpan('http-request');
span.setTag('http.method', req.method);
span.setTag('http.url', req.url);
res.on('finish', () => {
span.setTag('http.status_code', res.statusCode);
span.finish();
});
next();
});