Juju ile metric toplama

Umut Dağ
2 min readAug 5, 2021

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çin
  • absolute: 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.

--

--