pluginmanager/metric_export.go (72 lines of code) (raw):

// Copyright 2024 iLogtail Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package pluginmanager import ( goruntimemetrics "runtime/metrics" "strconv" "strings" "github.com/alibaba/ilogtail/pkg/helper/k8smeta" "github.com/alibaba/ilogtail/pkg/selfmonitor" ) const ( MetricExportTypeGo = "direct" MetricExportTypeCpp = "cpp_provided" ) func GetMetrics(metricType string) []map[string]string { if metricType == MetricExportTypeGo { return GetGoDirectMetrics() } if metricType == MetricExportTypeCpp { return GetGoCppProvidedMetrics() } return []map[string]string{} } // 直接输出的go指标,例如go插件指标 // // []map[string]string{ // { // "labels": "{\"category\": \"plugin\",\"plugin_type\":\"flusher_stdout\"}", // "counters": "{\"proc_in_records_total\": \"100\"}" // "gauges": "{}" // }, // { // "labels": "{\"category\": \"runner\",\"runner_name\":\"k8s_meta\"}", // "counters": "{\"proc_in_records_total\": \"100\"}", // "gauges": "{\"cache_size\": \"100\"}" // } // }, // } func GetGoDirectMetrics() []map[string]string { metrics := make([]map[string]string, 0) // go plugin metrics metrics = append(metrics, GetGoPluginMetrics()...) // k8s meta metrics metrics = append(metrics, k8smeta.GetMetaManagerMetrics()...) return metrics } // 由C++定义的指标,go把值传过去,例如go的进程级指标 // // []map[string]string{ // { // "go_memory_used_mb": "100", // "go_routines_total": "20" // } // } func GetGoCppProvidedMetrics() []map[string]string { metrics := make([]map[string]string, 0) // agent-level metrics metrics = append(metrics, GetAgentStat()...) return metrics } // go 插件指标,直接输出 func GetGoPluginMetrics() []map[string]string { metrics := make([]map[string]string, 0) LogtailConfigLock.RLock() for _, config := range LogtailConfig { metrics = append(metrics, config.Context.ExportMetricRecords()...) } LogtailConfigLock.RUnlock() return metrics } // go 进程级指标,由C++部分注册 func GetAgentStat() []map[string]string { metrics := []map[string]string{} metric := map[string]string{} // key is the metric key in runtime/metrics, value is agent's metric key metricNames := map[string]string{ // mem. Memory occupied by live objects and dead objects that have not yet been marked free by the garbage collector. "/memory/classes/heap/objects:bytes": selfmonitor.MetricAgentMemoryGo, // go routines cnt. Count of live goroutines. "/sched/goroutines:goroutines": selfmonitor.MetricAgentGoRoutinesTotal, } // metrics to read from runtime/metrics samples := make([]goruntimemetrics.Sample, 0) for name := range metricNames { samples = append(samples, goruntimemetrics.Sample{Name: name}) } goruntimemetrics.Read(samples) // push results to recrods for _, sample := range samples { key := metricNames[sample.Name] value := sample.Value valueStr := "" switch value.Kind() { case goruntimemetrics.KindUint64: if strings.HasSuffix(key, "_mb") { valueStr = strconv.FormatUint(value.Uint64()/1024/1024, 10) } else { valueStr = strconv.FormatUint(value.Uint64(), 10) } case goruntimemetrics.KindFloat64: valueStr = strconv.FormatFloat(value.Float64(), 'g', -1, 64) } metric[key] = valueStr } metrics = append(metrics, metric) return metrics }