netdata/netdata

View on GitHub
src/go/collectors/go.d.plugin/modules/logstash/charts.go

Summary

Maintainability
A
3 hrs
Test Coverage
// SPDX-License-Identifier: GPL-3.0-or-later

package logstash

import (
    "fmt"
    "strings"

    "github.com/netdata/netdata/go/go.d.plugin/agent/module"
)

const (
    prioJVMThreads = module.Priority + iota
    prioJVMMemHeapUsed
    prioJVMMemHeap
    prioJVMMemPoolsEden
    prioJVMMemPoolsSurvivor
    prioJVMMemPoolsOld
    prioJVMGCCollectorCount
    prioJVMGCCollectorTime
    prioOpenFileDescriptors
    prioEvent
    prioEventDuration
    prioPipelineEvent
    prioPipelineEventDurations
    prioUptime
)

var charts = module.Charts{
    // thread
    {
        ID:       "jvm_threads",
        Title:    "JVM Threads",
        Units:    "count",
        Fam:      "threads",
        Ctx:      "logstash.jvm_threads",
        Priority: prioJVMThreads,
        Dims: module.Dims{
            {ID: "jvm_threads_count", Name: "threads"},
        },
    },
    // memory
    {
        ID:       "jvm_mem_heap_used",
        Title:    "JVM Heap Memory Percentage",
        Units:    "percentage",
        Fam:      "memory",
        Ctx:      "logstash.jvm_mem_heap_used",
        Priority: prioJVMMemHeapUsed,
        Dims: module.Dims{
            {ID: "jvm_mem_heap_used_percent", Name: "in use"},
        },
    },
    {
        ID:       "jvm_mem_heap",
        Title:    "JVM Heap Memory",
        Units:    "KiB",
        Fam:      "memory",
        Ctx:      "logstash.jvm_mem_heap",
        Type:     module.Area,
        Priority: prioJVMMemHeap,
        Dims: module.Dims{
            {ID: "jvm_mem_heap_committed_in_bytes", Name: "committed", Div: 1024},
            {ID: "jvm_mem_heap_used_in_bytes", Name: "used", Div: 1024},
        },
    },
    {
        ID:       "jvm_mem_pools_eden",
        Title:    "JVM Pool Eden Memory",
        Units:    "KiB",
        Fam:      "memory",
        Ctx:      "logstash.jvm_mem_pools_eden",
        Type:     module.Area,
        Priority: prioJVMMemPoolsEden,
        Dims: module.Dims{
            {ID: "jvm_mem_pools_eden_committed_in_bytes", Name: "committed", Div: 1024},
            {ID: "jvm_mem_pools_eden_used_in_bytes", Name: "used", Div: 1024},
        },
    },
    {
        ID:       "jvm_mem_pools_survivor",
        Title:    "JVM Pool Survivor Memory",
        Units:    "KiB",
        Fam:      "memory",
        Ctx:      "logstash.jvm_mem_pools_survivor",
        Type:     module.Area,
        Priority: prioJVMMemPoolsSurvivor,
        Dims: module.Dims{
            {ID: "jvm_mem_pools_survivor_committed_in_bytes", Name: "committed", Div: 1024},
            {ID: "jvm_mem_pools_survivor_used_in_bytes", Name: "used", Div: 1024},
        },
    },
    {
        ID:       "jvm_mem_pools_old",
        Title:    "JVM Pool Old Memory",
        Units:    "KiB",
        Fam:      "memory",
        Ctx:      "logstash.jvm_mem_pools_old",
        Type:     module.Area,
        Priority: prioJVMMemPoolsOld,
        Dims: module.Dims{
            {ID: "jvm_mem_pools_old_committed_in_bytes", Name: "committed", Div: 1024},
            {ID: "jvm_mem_pools_old_used_in_bytes", Name: "used", Div: 1024},
        },
    },
    // garbage collection
    {
        ID:       "jvm_gc_collector_count",
        Title:    "Garbage Collection Count",
        Units:    "counts/s",
        Fam:      "garbage collection",
        Ctx:      "logstash.jvm_gc_collector_count",
        Priority: prioJVMGCCollectorCount,
        Dims: module.Dims{
            {ID: "jvm_gc_collectors_eden_collection_count", Name: "eden", Algo: module.Incremental},
            {ID: "jvm_gc_collectors_old_collection_count", Name: "old", Algo: module.Incremental},
        },
    },
    {
        ID:       "jvm_gc_collector_time",
        Title:    "Time Spent On Garbage Collection",
        Units:    "ms",
        Fam:      "garbage collection",
        Ctx:      "logstash.jvm_gc_collector_time",
        Priority: prioJVMGCCollectorTime,
        Dims: module.Dims{
            {ID: "jvm_gc_collectors_eden_collection_time_in_millis", Name: "eden", Algo: module.Incremental},
            {ID: "jvm_gc_collectors_old_collection_time_in_millis", Name: "old", Algo: module.Incremental},
        },
    },
    // processes
    {
        ID:       "open_file_descriptors",
        Title:    "Open File Descriptors",
        Units:    "fd",
        Fam:      "processes",
        Ctx:      "logstash.open_file_descriptors",
        Priority: prioOpenFileDescriptors,
        Dims: module.Dims{
            {ID: "process_open_file_descriptors", Name: "open"},
        },
    },
    // events
    {
        ID:       "event",
        Title:    "Events Overview",
        Units:    "events/s",
        Fam:      "events",
        Ctx:      "logstash.event",
        Priority: prioEvent,
        Dims: module.Dims{
            {ID: "event_in", Name: "in", Algo: module.Incremental},
            {ID: "event_filtered", Name: "filtered", Algo: module.Incremental},
            {ID: "event_out", Name: "out", Algo: module.Incremental},
        },
    },
    {
        ID:       "event_duration",
        Title:    "Events Duration",
        Units:    "seconds",
        Fam:      "events",
        Ctx:      "logstash.event_duration",
        Priority: prioEventDuration,
        Dims: module.Dims{
            {ID: "event_duration_in_millis", Name: "event", Div: 1000, Algo: module.Incremental},
            {ID: "event_queue_push_duration_in_millis", Name: "queue", Div: 1000, Algo: module.Incremental},
        },
    },
    // uptime
    {
        ID:       "uptime",
        Title:    "Uptime",
        Units:    "seconds",
        Fam:      "uptime",
        Ctx:      "logstash.uptime",
        Priority: prioUptime,
        Dims: module.Dims{
            {ID: "jvm_uptime_in_millis", Name: "uptime", Div: 1000},
        },
    },
}

var pipelineChartsTmpl = module.Charts{
    {
        ID:       "pipeline_%s_event",
        Title:    "Pipeline Events",
        Units:    "events/s",
        Fam:      "pipeline events",
        Ctx:      "logstash.pipeline_event",
        Priority: prioPipelineEvent,
        Dims: module.Dims{
            {ID: "pipelines_%s_event_in", Name: "in", Algo: module.Incremental},
            {ID: "pipelines_%s_event_filtered", Name: "filtered", Algo: module.Incremental},
            {ID: "pipelines_%s_event_out", Name: "out", Algo: module.Incremental},
        },
    },
    {
        ID:       "pipeline_%s_event_duration",
        Title:    "Pipeline Events Duration",
        Units:    "seconds",
        Fam:      "pipeline events duration",
        Ctx:      "logstash.pipeline_event_duration",
        Priority: prioPipelineEventDurations,
        Dims: module.Dims{
            {ID: "pipelines_%s_event_duration_in_millis", Name: "event", Div: 1000, Algo: module.Incremental},
            {ID: "pipelines_%s_event_queue_push_duration_in_millis", Name: "queue", Div: 1000, Algo: module.Incremental},
        },
    },
}

func (l *Logstash) addPipelineCharts(id string) {
    charts := pipelineChartsTmpl.Copy()

    for _, chart := range *charts {
        chart.ID = fmt.Sprintf(chart.ID, id)
        chart.Labels = []module.Label{
            {Key: "pipeline", Value: id},
        }
        for _, dim := range chart.Dims {
            dim.ID = fmt.Sprintf(dim.ID, id)
        }
    }

    if err := l.Charts().Add(*charts...); err != nil {
        l.Warning(err)
    }
}

func (l *Logstash) removePipelineCharts(id string) {
    for _, chart := range *l.Charts() {
        if strings.HasPrefix(chart.ID, "pipeline_"+id) {
            chart.MarkRemove()
            chart.MarkNotCreated()
        }
    }
}