Monitoring Errors dengan Jaeger

Monitoring Errors dengan Jaeger

Distributed tracing dengan Jaeger dapat digunakan untuk memantau error. Kita dapat menemukan span mana yang mengalami error dan melihat log error. Artikel ini akan menunjukkan caranya.

Jalankan Jaeger

Untuk menjalankan Jaeger di environment lokal, ikuti instruksi di sini.
Jika kamu tidak tahu apa itu Jaeger dan distribution tracing, saya juga menyarankan kamu membaca artikel sebelumnya di sini.
Jika kamu belum pernah mengintegrasikan aplikasi kamu dengan Jaeger, saya juga menyarankan kamu membaca artikel itu.
Jika kamu telah berhasil menjalankan Jaeger dan mengintegrasikan dasar-dasarnya, sekarang saatnya untuk memonitor error.

Monitor errors

Cara menunjukkan error dalam sebuah span

Untuk menandai fungsi yang mengalami error, kita perlu memulai span dalam fungsi dan mengeset tag error ke true. Ada library dari opentracing untuk melakukan itu, yaitu opentracing-go/ext. Lihat contoh kode di bawah ini untuk menunjukkan error dalam span.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import (
    "github.com/opentracing/opentracing-go/ext"
)

func getCityHandler(w http.ResponseWriter, r *http.Request) {
    span, ctx := opentracing.StartSpanFromContext(r.Context(), "Handle /get_cities")
    defer span.Finish()

    // ...

    countryName := r.FormValue("country_name")
    if countryName == "" {
        w.Write([]byte("got error: country_name must not be empty"))
        ext.Error.Set(span, true)
        return
    }

    // ...
}
Pada baris 6, kita membuat span dalam function. Hal ini wajib dilakukan untuk melihat function kamu di JaegerUI. Kemudian pada baris 14, kita mengeset error span menjadi true ketika terjadi kesalahan. Kita melakukannya dengan menggunakan package ext dari opentracing-go/ext. Mari kita tes dan lihat di JaegerUI.

Jaeger Error Traces

Gambar di atas adalah traces di hasil pencarian. Ada error counter di kotak merah yang menunjukkan berapa banyak kesalahan yang dimiliki suatu trace.
Kita dapat mencari traces yang mendapat error dengan tags filter. Coba cari error tag error=true. Itu hanya akan menampilkan trace yang memiliki error.
Mari klik salah satunya untuk melihat detailnya.

Jaeger Error Tag in Trace

Span yang mengalami error ditandai dengan tanda seru berwarna merah. Kita melihat dalam detail dari span bahwa tag error disetel ke true. Inilah yang memberi tahu Jaeger bahwa span memiliki error.

Log error di span

Kita dapat menambahkan error log dalam span. Mungkin itu bisa membantu kita mengidentifikasi masalah dan memperbaikinya. Lihatlah kode di bawah ini untuk menambahkan error log dalam span.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import (
    "github.com/opentracing/opentracing-go/ext"
)

func getCityByCountryNameFromDB(ctx context.Context, countryName string) ([]City, error) {
    span, ctx := opentracing.StartSpanFromContext(ctx, "getCityByCountryNameFromDB")
    defer span.Finish()

    // ...
    
    if err != nil {
        ext.LogError(span, err)
        return nil, err
    }

    // ...
}
Error dicatat menggunakan fungsi LogError dari package ext. Kita tidak perlu menyetel tag error ke true jika kita menggunakan fungsi LogError karena fungsi tersebut sudah menyetel tag error ke true. Sekarang mari kita lihat error span di JaegerUI.

Jaeger Error Log in Trace

Tambahkan fields di error log

Terkadang log error tidak cukup. Kita mungkin ingin menambahkan field di error log. Kita bisa melakukan itu. Lihat contoh kode di bawah ini.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import (
    "github.com/opentracing/opentracing-go/ext"
    "github.com/opentracing/opentracing-go/log"
)

func getCityByCountryNameFromDB(ctx context.Context, countryName string) ([]City, error) {
    span, ctx := opentracing.StartSpanFromContext(ctx, "getCityByCountryNameFromDB")
    defer span.Finish()

    // ...
    
    if err != nil {
        ext.LogError(span, err, log.String("countryName", countryName))
        return nil, err
    }

    // ...
}

Kita dapat menambahkan lebih dari satu field di log jika diperlukan. Sekarang mari kita lihat di JaegerUI.

Jaeger Error Log FIeld in Trace

Kita dapat melihat field kita di log. Mungkin dengan ini, kita bisa mengetahui root cause dari error.

Kesimpulan

Kita dapat monitor dan mencari trace yang memiliki error di Jaeger. Untuk melakukan itu kita perlu mengatur tag error dari span yang mendapat error. Kita juga dapat menambahkan log error dan field untuk membantu mengidentifikasi error. Opentracing memiliki library standar untuk melakukan ini, jadi integrasinya tidak akan sulit.


See also

comments powered by Disqus