Я добавляю вызовы метрик в свою программу Go, используя Prometheus. Я решил разделить все вызовы Prometheus на простые вызовы функций в отдельном исходном файле для удобства обслуживания (на случай, если я захочу перейти к другому пакету метрик). Но что более важно, это также ускоряет написание кода, поскольку среда IDE запрашивает имена меток в качестве параметров для вызова функции. Например, что-то вроде этого:
var requestCounter = promauto.NewCounterVec(prometheus.CounterOpts{}, []string{"name"})
func incrementRequestCounter(label1, label2 string) {
requestCounter.WithLabelValues(label1, label2).Inc()
}
Некоторые из этих функций часто вызываются в низкоуровневом цикле, поэтому я не хочу, чтобы эти вызовы слишком сильно замедляли код. Я предполагал, что такую простую строку кода будет легко встроить. Однако, проверяя (с опцией сборки --gcflags -m
), я обнаружил, что вышеуказанная однострочная функция не встроена (go1.12.5 windows / amd64). Кто-нибудь знает почему? И как это обойти? Обратите внимание, что эта функция является встроенной:
func incrementRequestCounter(label1, label2 string) {
requestCounter.WithLabelValues(label1, label2)
}
При дальнейшем экспериментировании кажется, что функция не будет встроенной, если она имеет более одного вызова не -линейных функций. (У вас может быть много вызовов встроенных функций, и функция все равно будет встроенной.)