【发布时间】:2020-06-06 01:00:11
【问题描述】:
我正在阅读latency measurement codes,因为我发现测量的延迟高于 python 代码测量的端到端延迟。 下面InstrumentRoundTripperDuration的用法对吗?我在网上没有找到类似的例子。
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
// metrics client
func NewClientMetrics(spec *v1.PredictorSpec, deploymentName string, modelName string) *ClientMetrics {
histogram := prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: ClientRequestsMetricName,
Help: "A histogram of latencies for client calls from executor",
Buckets: prometheus.DefBuckets,
},
[]string{DeploymentNameMetric, PredictorNameMetric, PredictorVersionMetric, ServiceMetric, ModelNameMetric, ModelImageMetric, ModelVersionMetric, "method", "code"},
)
err := prometheus.Register(histogram)
if err != nil {
prometheus.Unregister(histogram)
prometheus.Register(histogram)
}
...
return &ClientMetrics{
ClientHandledHistogram: histogram,
Predictor: spec,
DeploymentName: deploymentName,
ModelName: modelName,
ImageName: imageName,
ImageVersion: imageVersion,
}
}
// In json rest client, construct metrics client
func NewJSONRestClient(protocol string, deploymentName string, predictor *v1.PredictorSpec, annotations map[string]string, options ...BytesRestClientOption) (client.SeldonApiClient, error) {
httpClient := http.DefaultClient
...
client := JSONRestClient{
httpClient,
logf.Log.WithName("JSONRestClient"),
protocol,
deploymentName,
predictor,
metric.NewClientMetrics(predictor, deploymentName, ""),
}
...
return &client, nil
}
// In Json rest client, create a function to measure roundtrip latency
func (smc *JSONRestClient) getMetricsRoundTripper(modelName string, service string) http.RoundTripper {
...
return promhttp.InstrumentRoundTripperDuration(smc.metrics.ClientHandledHistogram.MustCurryWith(prometheus.Labels{
metric.DeploymentNameMetric: smc.DeploymentName,
metric.PredictorNameMetric: smc.predictor.Name,
metric.PredictorVersionMetric: smc.predictor.Annotations["version"],
metric.ServiceMetric: service,
metric.ModelNameMetric: modelName,
metric.ModelImageMetric: imageName,
metric.ModelVersionMetric: imageVersion,
}), http.DefaultTransport)
}
// http call (getMetricsRoundTripper is called middleware)
client := smc.httpClient
client.Transport = smc.getMetricsRoundTripper(modelName, method)
源代码:
https://github.com/SeldonIO/seldon-core/blob/master/executor/api/rest/client.go#L88 和第 148、118 行
https://github.com/SeldonIO/seldon-core/blob/master/executor/api/metric/client.go#L22
谢谢
【问题讨论】:
标签: go prometheus latency prometheus-alertmanager