Takım Bazlı Telemetri Maliyet Panosu
Selamlar, bu yazımda biraz farklı bir yere bakacağız. Genelde gözlemlenebilirlik (observability) yazılarında 'şu metriği nasıl topladık', 'şu trace'i nasıl bağladık' anlatılır. Ben bu sefer faturanın geldiği tarafa bakmak istiyorum: telemetri verisi büyüdükçe gelen aylık maliyetin takım ve servis bazında nasıl görünür hale getirileceği. Çünkü görünmeyen masraf yönetilmiyor, biliyorsunuz.
Önce attribute disiplini
Her şey, OpenTelemetry tarafında düzgün attribute koymakla başlıyor. Maliyeti takıma göre kırmak istiyorsan, span'lerin, log'ların ve metric'lerin üstünde team.name ve service.name mutlaka olmalı. Bunu kod tarafında elle yazmaya çalışmak ileride başınızı ağrıtır; bence en temizi resource attribute'larını deployment manifesto'sundan otomatik enjekte etmek. Kubernetes kullanıyorsanız Operator'ın resource attribute'larıyla halledebilirsiniz.
Buradaki kritik nokta şu: team.name değeri stabil ve kısıtlı olmalı. Bir takımın adı bugün 'payments', yarın 'odeme-takimi' olursa pano kırılır. Şahsi tavsiyem, takım kimliklerini bir yerde merkezi tutup CI'da doğrulamak.
Volume metric'lerini Collector'da üretmek
OpenTelemetry Collector'ın count connector'ı tam olarak bu iş için var. Gateway katmanına gelen span, log ve metric data point'lerini takım/servis attribute'larına göre saydırıyoruz, sonra bunları Prometheus'a yazdırıyoruz. Aşağıda kabaca böyle bir yapılandırma:
connectors:
count:
spans:
spans.total:
description: 'Toplam span sayisi'
attributes:
- key: team.name
- key: service.name
logs:
logs.total:
attributes:
- key: team.name
- key: service.name
exporters:
prometheus:
endpoint: 0.0.0.0:8889
resource_to_telemetry_conversion:
enabled: true
service:
pipelines:
traces:
receivers: [otlp]
exporters: [otlphttp/backend, count]
metrics/volume:
receivers: [count]
exporters: [prometheus]
Burada gözden kaçmaması gereken şey, count connector'ın hem traces pipeline'ının exporter'ı, hem de metrics/volume pipeline'ının receiver'ı olması. Yani span akışını kesmiyor, kopyasını sayıp ayrı bir metric serisi üretiyor.
Maliyeti Prometheus tarafında hesaplamak
Volume metric'leri elimize geçtikten sonra dolar/lira hesabı recording rule'larla yapılır. Vendor'a göre birim fiyatlar değişir; benim yaptığım, fiyatları tek bir yerde sabit tutup orada güncellemek:
groups:
- name: telemetri-maliyet
interval: 5m
rules:
- record: telemetry:cost:spans:hour
expr: |
sum by (team_name, service_name) (
increase(spans_total[1h])
) * 0.0000005
- record: telemetry:cost:total:hour
expr: |
sum by (team_name) (
telemetry:cost:spans:hour
+ telemetry:cost:logs:hour
)
- record: telemetry:cost:projected:monthly
expr: telemetry:cost:total:hour * 24 * 30
Saatlik maliyeti aylığa çevirirken * 24 * 30 yapmak kabaca doğru ama trafik gün içi değişkenliği yüksek bir servis için yanıltıcı olabilir. İleri seviye için 7 günlük ortalama üzerinden projection almak daha sağlıklı.
Grafana panelleri
Pano tarafında dört temel panelden başlamanızı öneririm: toplam aylık projeksiyon (stat), takıma göre dağılım (pie chart), günlük trend (timeseries) ve top 10 pahalı servis (bargauge). Buradaki amaç tek bir bakışta 'kim ne kadar harcıyor' sorusuna cevap vermek.
Takım liderlerine haftalık özet göndermek de işi tamamlıyor. Basit bir Python script'iyle Prometheus'a sorguyu atıp Slack'e mesaj atabilirsiniz; bunu Slack webhook'uyla halletmek 50 satırı geçmez.
Sık karşılaşılan hatalar
- Cardinality patlatmak:
team.nameiyi de, oraya kullanıcı id'si veya request id'si gibi yüksek cardinality bir alan kaçarsa Prometheus'u kendi panonuzla şişirirsiniz. Sadece düşük cardinality boyutları attribute olarak sayın. - Sampling'i unutmak: Pano size pahalı servisleri gösteriyor diye işiniz bitmiyor; tail-based sampling olmadan bazı takımların tüm error trace'leri olduğu gibi geliyor olabilir. Maliyet kırılımı sampling kararıyla beraber okunur.
- Tek pipeline'a yüklenmek: Volume saymayı production trace pipeline'ına bağlamak, count connector'ında bir hata olduğunda gerçek trace akışını da etkiler.
metrics/volumeayrı bir pipeline olsun.
Kapanış
Telemetri maliyetini görünür kılmak FinOps'un gözlemlenebilirliğe uzanması gibi bir şey aslında. Bence her ekibin kendi telemetri faturasını görmeye başlaması, log seviyesi ve metric cardinality kararlarını çok hızlı düzeltiyor; kimse panoda kırmızı görmek istemiyor. Umarım faydalı olur, bir sonraki yazıda görüşmek üzere.
