Ctrl K
ComunidadGuías…

constructor/jvm.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package constructor

import (
	"strings"

	"github.com/coroot/coroot/model"
	"github.com/coroot/coroot/timeseries"
)

func (c *Constructor) loadJVM(metrics map[string][]*model.MetricValues, containers containerCache) {
	load := func(queryName string, f func(jvm *model.Jvm, metric *model.MetricValues)) {
		for _, metric := range metrics[queryName] {
			v := containers[metric.NodeContainerId]
			if v.instance == nil {
				continue
			}
			name := metric.Labels["jvm"]
			if name == "" {
				continue
			}
			if v.instance.Jvms == nil {
				v.instance.Jvms = map[string]*model.Jvm{}
			}
			name = jvmName(name)
			jvm := v.instance.Jvms[name]
			if jvm == nil {
				jvm = &model.Jvm{GcTime: map[string]*timeseries.TimeSeries{}}
				v.instance.Jvms[name] = jvm
			}
			f(jvm, metric)
		}
	}
	load("container_jvm_info", func(jvm *model.Jvm, metric *model.MetricValues) {
		jvm.JavaVersion.Update(metric.Values, metric.Labels["java_version"])
	})
	load("container_jvm_heap_used_bytes", func(jvm *model.Jvm, metric *model.MetricValues) {
		jvm.HeapUsed = merge(jvm.HeapUsed, metric.Values, timeseries.Any)
	})
	load("container_jvm_gc_time_seconds", func(jvm *model.Jvm, metric *model.MetricValues) {
		gc := metric.Labels["gc"]
		jvm.GcTime[gc] = merge(jvm.GcTime[gc], metric.Values, timeseries.Any)
	})
	load("container_jvm_safepoint_time_seconds", func(jvm *model.Jvm, metric *model.MetricValues) {
		jvm.SafepointTime = merge(jvm.SafepointTime, metric.Values, timeseries.Any)
	})
	load("container_jvm_safepoint_sync_time_seconds", func(jvm *model.Jvm, metric *model.MetricValues) {
		jvm.SafepointSyncTime = merge(jvm.SafepointSyncTime, metric.Values, timeseries.Any)
	})
	load("container_jvm_heap_max_size_bytes", func(jvm *model.Jvm, metric *model.MetricValues) {
		jvm.HeapMaxSize = merge(jvm.HeapMaxSize, metric.Values, timeseries.Any)
	})
	load("container_jvm_alloc_bytes_total", func(jvm *model.Jvm, metric *model.MetricValues) {
		jvm.AllocBytes = merge(jvm.AllocBytes, metric.Values, timeseries.Any)
	})
	load("container_jvm_alloc_objects_total", func(jvm *model.Jvm, metric *model.MetricValues) {
		jvm.AllocObjects = merge(jvm.AllocObjects, metric.Values, timeseries.Any)
	})
	load("container_jvm_lock_contentions_total", func(jvm *model.Jvm, metric *model.MetricValues) {
		jvm.LockContentions = merge(jvm.LockContentions, metric.Values, timeseries.Any)
	})
	load("container_jvm_lock_time_seconds_total", func(jvm *model.Jvm, metric *model.MetricValues) {
		jvm.LockTime = merge(jvm.LockTime, metric.Values, timeseries.Any)
	})
	load("container_jvm_profiling_status", func(jvm *model.Jvm, metric *model.MetricValues) {
		if metric.Values.Last() > 0 {
			jvm.ProfilingEnabled = true
		}
	})
}

func jvmName(s string) string {
	parts := strings.Fields(s)
	if len(parts) == 0 {
		return "unknown"
	}
	if strings.HasSuffix(parts[0], ".jar") {
		parts = strings.Split(parts[0], "/")
		return parts[len(parts)-1]
	}
	parts = strings.Split(parts[0], ".")
	return parts[len(parts)-1]
}