Juju ile metric toplamak için 2 şeye ihtiyacımız var:
- Charm’ın metricleri tanıması için metrics.yaml dosyası
- Metricleri toplamak için 5 dakika aralıklarla çalışan collect-metrics hook’u
metrics.yaml
Örnek bir metrics.yaml:
metrics:
cpu_util:
type: gauge # Zorunlu
description: İşlemci kullanım yüzdesi # Zorunlu
mem_free:
type: gauge
description: Serbest RAM yüzdesi
type
bölümüne iki farklı değer verebiliriz:
gauge
: Anlık değer okumak içinabsolute
: Son ölçümden bu yana değerleri takip etmek için
Ek olarak, type
ve description
alanları dışında Juju command
alanı da kabul etmekte. Ancak son sürümde bu alanın metric toplarken bir etki etmediği gözlemlenmiştir.
Hook collect-metrics
collect-metrics
hook'u Juju tarafından 5 dakika aralıklarla çalıştırılır. Charm kodunda bu hook çalıştırıldığında on.collect_metrics
event'i tetiklenir. Bu event'in davranışını değiştirerek metric toplayabiliriz.
Örnek event aşağıdaki gibidir:
on_collect_metrics
fonksiyonunun içerisinde bizim için önemli olan yer
kısmıdır. add_metrics
fonksiyonu parametre olarak dict
alır. Bu dict
içerisindeki her key, metrics.yaml
içerisinde tanımladığımız metric'e denk gelir ve dict
içerisindeki her value ise alınan metric'in değiridir. add_metrics
methodu verdiğimiz key:value eşlerine göre Juju'ya metric ekliyor, böylelikle metricleri görebiliyoruz.
Önemli not: Eğer dikkat ettiyseniz, add_metrics
fonksiyonuna metricleri verirken, metric değerleri integer'a çevriliyor. Bunun nedeni, float verildiğinde (virgülden sonra kaç basamak olduğu önemli değil) değer Juju'ya giderken virgülden sonraki kısım bozuluyor. Örneğin değer 1.29 ise, Juju'ya 1.2899999999999999999999999999999999999999... (9'lardan sonra rastgele rakamlar geliyor) olarak gidiyor. Bundan dolayı iste Juju
ERROR cannot record metric: metric value is too large
hatası veriyor.
Not: Bu şekilde metric topladığımızda charm ilk deploy edildiğinde metric değerleri alamıyoruz. Ancak 5 dakika sonra Juju tekrar otomatik olarak collect-metrics
hook'unu çağırdığı zaman metriclerin geldiğini
juju metrics <app-name>
veya unit için
juju metrics <app-name>/<unit-number>
veya bütün metricler için
juju metrics --all
ile görebiliyoruz.
Bozuk juju collect-metrics
komutu
Juju’nun içerisinde el ile collect-metrics
hook'unu tetiklemek için collet-metrics
komutu bulunmakta. Bu komut çalıştırıldığında on_collect_metrics
event'i tetikleniyor. Charm'ın içerisinde karşılık gelen kod çalışıyor, ancak Juju'ya metric eklenmiyor ve
failed to collect metrics: could not read stdout
çıktısı geliyor.