用 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();
});