Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Implement comprehensive observability for service meshes including distributed tracing, metrics, and visualization. Use when setting up mesh monitoring, debugging latency issues, or implementing SLOs for service communication.
.claude/skills/dicklesworthstone-service-mesh-observability/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 103% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 124% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 128% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 58% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 130% | 0% |
Complete guide to observability patterns for Istio, Linkerd, and service mesh deployments.
┌─────────────────────────────────────────────────────┐
│ Observability │
├─────────────────┬─────────────────┬─────────────────┤
│ Metrics │ Traces │ Logs │
│ │ │ │
│ • Request rate │ • Span context │ • Access logs │
│ • Error rate │ • Latency │ • Error details │
│ • Latency P50 │ • Dependencies │ • Debug info │
│ • Saturation │ • Bottlenecks │ • Audit trail │
└─────────────────┴─────────────────┴─────────────────┘| Signal | Description | Alert Threshold | | -------------- | ------------------------- | ----------------- | | Latency | Request duration P50, P99 | P99 > 500ms | | Traffic | Requests per second | Anomaly detection | | Errors | 5xx error rate | > 1% | | Saturation | Resource utilization | > 80% |
yaml# Install Prometheus apiVersion: v1 kind: ConfigMap metadata: name: prometheus namespace: istio-system data: prometheus.yml: | global: scrape_interval: 15s scrape_configs: - job_name: 'istio-mesh' kubernetes_sd_configs: - role: endpoints namespaces: names: - istio-system relabel_configs: - source_labels: [__meta_kubernetes_service_name] action: keep regex: istio-telemetry --- # ServiceMonitor for Prometheus Operator apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: istio-mesh namespace: istio-system spec: selector: matchLabels: app: istiod endpoints: - port: http-monitoring interval: 15s
promql# Request rate by service sum(rate(istio_requests_total{reporter="destination"}[5m])) by (destination_service_name) # Error rate (5xx) sum(rate(istio_requests_total{reporter="destination", response_code=~"5.."}[5m])) / sum(rate(istio_requests_total{reporter="destination"}[5m])) * 100 # P99 latency histogram_quantile(0.99, sum(rate(istio_request_duration_milliseconds_bucket{reporter="destination"}[5m])) by (le, destination_service_name)) # TCP connections sum(istio_tcp_connections_opened_total{reporter="destination"}) by (destination_service_name) # Request size histogram_quantile(0.99, sum(rate(istio_request_bytes_bucket{reporter="destination"}[5m])) by (le, destination_service_name))
yaml# Jaeger installation for Istio apiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: meshConfig: enableTracing: true defaultConfig: tracing: sampling: 100.0 # 100% in dev, lower in prod zipkin: address: jaeger-collector.istio-system:9411 --- # Jaeger deployment apiVersion: apps/v1 kind: Deployment metadata: name: jaeger namespace: istio-system spec: selector: matchLabels: app: jaeger template: metadata: labels: app: jaeger spec: containers: - name: jaeger image: jaegertracing/all-in-one:1.50 ports: - containerPort: 5775 # UDP - containerPort: 6831 # Thrift - containerPort: 6832 # Thrift - containerPort: 5778 # Config - containerPort: 16686 # UI - containerPort: 14268 # HTTP - containerPort: 14250 # gRPC - containerPort: 9411 # Zipkin env: - name: COLLECTOR_ZIPKIN_HOST_PORT value: ":9411"
bash# Install Linkerd viz extension linkerd viz install | kubectl apply -f - # Access dashboard linkerd viz dashboard # CLI commands for observability # Top requests linkerd viz top deploy/my-app # Per-route metrics linkerd viz routes deploy/my-app --to deploy/backend # Live traffic inspection linkerd viz tap deploy/my-app --to deploy/backend # Service edges (dependencies) linkerd viz edges deployment -n my-namespace
json{ "dashboard": { "title": "Service Mesh Overview", "panels": [ { "title": "Request Rate", "type": "graph", "targets": [ { "expr": "sum(rate(istio_requests_total{reporter=\"destination\"}[5m])) by (destination_service_name)", "legendFormat": "{{destination_service_name}}" } ] }, { "title": "Error Rate", "type": "gauge", "targets": [ { "expr": "sum(rate(istio_requests_total{response_code=~\"5..\"}[5m])) / sum(rate(istio_requests_total[5m])) * 100" } ], "fieldConfig": { "defaults": { "thresholds": { "steps": [ { "value": 0, "color": "green" }, { "value": 1, "color": "yellow" }, { "value": 5, "color": "red" } ] } } } }, { "title": "P99 Latency", "type": "graph", "targets": [ { "expr": "histogram_quantile(0.99, sum(rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\"}[5m])) by (le, destination_service_name))", "legendFormat": "{{destination_service_name}}" } ] }, { "title": "Service Topology", "type": "nodeGraph", "targets": [ { "expr": "sum(rate(istio_requests_total{reporter=\"destination\"}[5m])) by (source_workload, destination_service_name)" } ] } ] } }
yaml# Kiali installation apiVersion: kiali.io/v1alpha1 kind: Kiali metadata: name: kiali namespace: istio-system spec: auth: strategy: anonymous # or openid, token deployment: accessible_namespaces: - "**" external_services: prometheus: url: http://prometheus.istio-system:9090 tracing: url: http://jaeger-query.istio-system:16686 grafana: url: http://grafana.istio-system:3000
yaml# OpenTelemetry Collector for mesh apiVersion: v1 kind: ConfigMap metadata: name: otel-collector-config data: config.yaml: | receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 zipkin: endpoint: 0.0.0.0:9411 processors: batch: timeout: 10s exporters: jaeger: endpoint: jaeger-collector:14250 tls: insecure: true prometheus: endpoint: 0.0.0.0:8889 service: pipelines: traces: receivers: [otlp, zipkin] processors: [batch] exporters: [jaeger] metrics: receivers: [otlp] processors: [batch] exporters: [prometheus] --- # Istio Telemetry v2 with OTel apiVersion: telemetry.istio.io/v1alpha1 kind: Telemetry metadata: name: mesh-default namespace: istio-system spec: tracing: - providers: - name: otel randomSamplingPercentage: 10
yamlapiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: mesh-alerts namespace: istio-system spec: groups: - name: mesh.rules rules: - alert: HighErrorRate expr: | sum(rate(istio_requests_total{response_code=~"5.."}[5m])) by (destination_service_name) / sum(rate(istio_requests_total[5m])) by (destination_service_name) > 0.05 for: 5m labels: severity: critical annotations: summary: "High error rate for {{ $labels.destination_service_name }}" - alert: HighLatency expr: | histogram_quantile(0.99, sum(rate(istio_request_duration_milliseconds_bucket[5m])) by (le, destination_service_name)) > 1000 for: 5m labels: severity: warning annotations: summary: "High P99 latency for {{ $labels.destination_service_name }}" - alert: MeshCertExpiring expr: | (certmanager_certificate_expiration_timestamp_seconds - time()) / 86400 < 7 labels: severity: warning annotations: summary: "Mesh certificate expiring in less than 7 days"
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | pass→pass | 10,756 | 8,639 | -20% | 1 | 1 | 0% | 1,658 | 4,367 | +163% | 0 | 0 | — |
case-23 | pass→pass | 13,558 | 12,563 | -7% | 1 | 1 | 0% | 2,309 | 4,742 | +105% | 0 | 0 | — |
case-01 | fail→pass | 15,114 | 15,683 | +4% | 1 | 1 | 0% | 3,029 | 6,161 | +103% | 0 | 0 | — |
case-02 | fail→fail | 19,014 | 14,339 | -25% | 1 | 1 | 0% | 3,773 | 5,846 | +55% | 0 | 0 | — |
case-03 | pass→pass | 9,582 | 8,467 | -12% | 1 | 1 | 0% | 1,693 | 4,343 | +157% | 0 | 0 | — |
case-04 | pass→pass | 8,724 | 7,545 | -14% | 1 | 1 | 0% | 1,637 | 4,203 | +157% | 0 | 0 | — |
case-05 | pass→pass | 10,300 | 6,011 | -42% | 1 | 1 | 0% | 1,846 | 3,949 | +114% | 0 | 0 | — |
case-06 | fail→pass | 10,877 | 8,282 | -24% | 1 | 1 | 0% | 1,936 | 4,342 | +124% | 0 | 0 | — |
case-07 | pass→pass | 9,140 | 6,958 | -24% | 1 | 1 | 0% | 1,852 | 4,175 | +125% | 0 | 0 | — |
case-08 | fail→pass | 10,158 | 8,691 | -14% | 1 | 1 | 0% | 1,954 | 4,453 | +128% | 0 | 0 | — |
case-09 | pass→pass | 7,706 | 4,405 | -43% | 1 | 1 | 0% | 1,310 | 3,675 | +181% | 0 | 0 | — |
case-10 | fail→fail | 15,482 | 12,120 | -22% | 1 | 1 | 0% | 3,160 | 5,302 | +68% | 0 | 0 | — |
case-11 | fail→fail | 27,406 | 17,920 | -35% | 1 | 1 | 0% | 5,849 | 6,622 | +13% | 0 | 0 | — |
case-12 | fail→pass | 14,397 | 8,330 | -42% | 1 | 1 | 0% | 2,776 | 4,392 | +58% | 0 | 0 | — |
case-13 | fail→pass | 9,770 | 7,278 | -26% | 1 | 1 | 0% | 1,863 | 4,292 | +130% | 0 | 0 | — |
case-14 | fail→fail | 20,422 | 11,305 | -45% | 1 | 1 | 0% | 3,738 | 5,013 | +34% | 0 | 0 | — |
case-15 | fail→pass | 10,629 | 3,109 | -71% | 1 | 1 | 0% | 1,616 | 3,368 | +108% | 0 | 0 | — |
case-21 | fail→pass | 11,041 | 10,193 | -8% | 1 | 1 | 0% | 2,029 | 4,754 | +134% | 0 | 0 | — |
case-16 | pass→pass | 20,971 | 18,552 | -12% | 1 | 1 | 0% | 3,582 | 6,255 | +75% | 0 | 0 | — |
case-17 | pass→pass | 11,726 | 3,381 | -71% | 1 | 1 | 0% | 2,061 | 3,550 | +72% | 0 | 0 | — |
case-18 | fail→pass | 15,377 | 5,398 | -65% | 1 | 1 | 0% | 2,877 | 3,864 | +34% | 0 | 0 | — |
case-19 | pass→pass | 9,868 | 9,595 | -3% | 1 | 1 | 0% | 1,592 | 4,124 | +159% | 0 | 0 | — |
case-20 | pass→fail | 38,514 | 17,759 | -54% | 1 | 1 | 0% | 3,565 | 5,717 | +60% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +30 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.