func GetDropOriginalMetrics()

in translator/translate/otel/common/metrics.go [66:177]


func GetDropOriginalMetrics(conf *confmap.Conf) map[string]bool {
	key := ConfigKey(MetricsKey, MetricsCollectedKey)
	value := conf.Get(key)
	if value == nil {
		return nil
	}
	categories := value.(map[string]interface{})
	dropOriginalMetrics := make(map[string]bool)
	for category := range categories {
		realCategoryName := config.GetRealPluginName(category)
		measurementCfgKey := ConfigKey(key, category, MeasurementKey)
		dropOriginalCfgKey := ConfigKey(key, category, DropOriginalMetricsKey)
		/* Drop original metrics does not support procstat since procstat can monitor multiple process
		   		"procstat": [
		           {
		             "exe": "W3SVC",
		             "measurement": [
		               "pid_count"
		             ]
		           },
		           {
		             "exe": "IISADMIN",
		             "measurement": [
		               "pid_count"
		             ]
		           }]
		   	Therefore, dropping the original metrics can conflict between these two processes (e.g customers can drop pid_count with the first
		   	process but not the second process)
		*/
		if dropMetrics := GetArray[any](conf, dropOriginalCfgKey); dropMetrics != nil {
			for _, dropMetric := range dropMetrics {
				if _, in := toDropMap[category]; in {
					dropMetricStr, ok := dropMetric.(string)
					if ok {
						dropOriginalMetrics[dropMetricStr] = true
					}
					continue
				}

				measurements := GetArray[any](conf, measurementCfgKey)
				if measurements == nil {
					continue
				}

				dropMetricStr, ok := dropMetric.(string)
				if !ok {
					continue
				}

				if !strings.Contains(dropMetricStr, category) && dropMetricStr != dropOriginalWildcard {
					dropMetricStr = metric.DecorateMetricName(realCategoryName, dropMetricStr)
				}
				isMetricDecoration := false
				for _, measurement := range measurements {
					switch val := measurement.(type) {
					/*
						 "disk": {
							"measurement": [
								{
									"name": "free",
									"rename": "DISK_FREE",
									"unit": "unit"
								}
							]
						}
					*/
					case map[string]interface{}:
						metricName, ok := val["name"].(string)
						if !ok {
							continue
						}
						if !strings.Contains(metricName, category) {
							metricName = metric.DecorateMetricName(realCategoryName, metricName)
						}
						// If customers provides drop_original_metrics with a wildcard (*), adding the renamed metric or add the original metric
						// if customers only re-unit the metric
						if strings.Contains(dropMetricStr, metricName) || dropMetricStr == dropOriginalWildcard {
							isMetricDecoration = true
							if newMetricName, ok := val["rename"].(string); ok {
								dropOriginalMetrics[newMetricName] = true
							} else {
								dropOriginalMetrics[metricName] = true
							}
						}

					/*
						"measurement": ["free"]
					*/
					case string:
						if dropMetricStr != dropOriginalWildcard {
							continue
						}
						metricName := val
						if !strings.Contains(metricName, category) {
							metricName = metric.DecorateMetricName(realCategoryName, metricName)
						}

						dropOriginalMetrics[metricName] = true
					default:
						continue
					}
				}

				if !isMetricDecoration && dropMetricStr != dropOriginalWildcard {
					dropOriginalMetrics[dropMetricStr] = true
				}

			}
		}
	}
	return dropOriginalMetrics
}