Skip to content

Commit e66c5b3

Browse files
committed
Support client metrics
1 parent a727701 commit e66c5b3

File tree

12 files changed

+356
-127
lines changed

12 files changed

+356
-127
lines changed

config/config.toml

+7-3
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,13 @@ outputPath = ""
2626

2727
[server.metrics.prometheus]
2828
addr = ":8082"
29-
# DisableHTTPRequestsTotalCounter = false
30-
# DisableHTTPRequestsDurationHistogram = false
31-
# DisableHTTPRequestsDurationSummary = true
29+
# DisableHTTPServerRequestsTotalCounter = false
30+
# DisableHTTPServerRequestsDurationHistogram = false
31+
# DisableHTTPServerRequestsDurationSummary = true
32+
# DisableHTTPClientRequestsTotalCounter = false
33+
# DisableHTTPClientRequestsDurationHistogram = false
34+
# DisableHTTPClientRequestsDurationSummary = true
35+
# DisableLogTotalCounter = false
3236

3337

3438
[[redis]]

config/metrics.go

+11-5
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,16 @@ type Metrics struct {
99
type Prometheus struct {
1010
Addr string
1111

12-
DisableHTTPRequestsTotalCounter bool
13-
DisableHTTPRequestsDurationHistogram bool
14-
DisableHTTPRequestsDurationSummary bool
12+
DisableHTTPServerRequestsTotalCounter bool
13+
DisableHTTPServerRequestsDurationHistogram bool
14+
DisableHTTPServerRequestsDurationSummary bool
15+
DisableHTTPClientRequestsTotalCounter bool
16+
DisableHTTPClientRequestsDurationHistogram bool
17+
DisableHTTPClientRequestsDurationSummary bool
18+
DisableLogTotalCounter bool
1519

16-
HTTPRequestsDurationHistogramBuckets []float64
17-
HTTPRequestsDurationSummaryObjectives map[float64]float64
20+
HTTPServerRequestsDurationHistogramBuckets []float64
21+
HTTPServerRequestsDurationSummaryObjectives map[float64]float64
22+
HTTPClientRequestsDurationHistogramBuckets []float64
23+
HTTPClientRequestsDurationSummaryObjectives map[float64]float64
1824
}

http/client.go

+28-10
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ import (
1515
"github.com/WiFeng/go-sky/log"
1616
)
1717

18+
const (
19+
clientContext clientContextKey = 0
20+
)
21+
1822
var (
1923
clientMap = map[string]*http.Client{}
2024
clientConfig = map[string]config.Client{}
@@ -25,12 +29,18 @@ var (
2529
ErrConfigNotFound = errors.New("client config is not found")
2630
)
2731

32+
type clientContextKey int
33+
type clientContextVal struct {
34+
peerName string
35+
}
36+
2837
// InitClient ...
29-
func InitClient(ctx context.Context, serviceName string, cfs []config.Client) {
38+
func InitClient(ctx context.Context, peerName string, cfs []config.Client) {
3039
for _, cf := range cfs {
3140
clientConfig[cf.Name] = cf
3241

3342
tr := NewRoundTripperFromConfig(cf.Transport)
43+
tr.Use(RoundTripperMetricsMiddleware)
3444
tr.Use(RoundTripperTracingMiddleware)
3545
tr.Use(RoundTripperLoggingMiddleware)
3646

@@ -52,31 +62,32 @@ func InitClient(ctx context.Context, serviceName string, cfs []config.Client) {
5262
// Client ...
5363
type Client struct {
5464
*kithttp.Client
65+
peerName string
5566
}
5667

5768
// NewClient ...
5869
func NewClient(
5970
ctx context.Context,
60-
serviceName string,
71+
peerName string,
6172
method string,
6273
uri string,
6374
enc kithttp.EncodeRequestFunc,
6475
dec kithttp.DecodeResponseFunc,
6576
opt ...kithttp.ClientOption) (*Client, error) {
6677

67-
cl, ok := clientMap[serviceName]
78+
cl, ok := clientMap[peerName]
6879
if !ok {
6980
err := ErrConfigNotFound
70-
log.Errorw(ctx, "http.NewClient, serviceName is not in clientMap map",
71-
"service_name", serviceName, "method", method, "uri", uri, "err", err)
81+
log.Errorw(ctx, "http.NewClient, peerName is not in clientMap map",
82+
"service_name", peerName, "method", method, "uri", uri, "err", err)
7283
return nil, err
7384
}
7485

75-
clf, ok := clientConfig[serviceName]
86+
clf, ok := clientConfig[peerName]
7687
if !ok {
7788
err := ErrConfigNotFound
78-
log.Errorw(ctx, "http.NewClient, serviceName is not in clientConfig map",
79-
"service_name", serviceName, "method", method, "uri", uri, "err", err)
89+
log.Errorw(ctx, "http.NewClient, peerName is not in clientConfig map",
90+
"service_name", peerName, "method", method, "uri", uri, "err", err)
8091
return nil, err
8192
}
8293

@@ -96,7 +107,7 @@ func NewClient(
96107
targetURL, err := url.Parse(uri)
97108
if err != nil {
98109
log.Errorw(ctx, "http.NewClient, url.Parse error",
99-
"service_name", serviceName, "method", method, "uri", uri, "err", err)
110+
"service_name", peerName, "method", method, "uri", uri, "err", err)
100111
return nil, err
101112
}
102113

@@ -106,13 +117,20 @@ func NewClient(
106117
kc := kithttp.NewClient(method, targetURL, enc, dec, options...)
107118
c := &Client{
108119
kc,
120+
peerName,
109121
}
110122

111123
return c, nil
112124
}
113125

114126
// Endpoint ...
115127
func (c Client) Endpoint() kitendpoint.Endpoint {
128+
// e := c.Client.Endpoint()
129+
// return e
116130
e := c.Client.Endpoint()
117-
return e
131+
f := func(ctx context.Context, request interface{}) (response interface{}, err error) {
132+
ctx = context.WithValue(ctx, clientContext, clientContextVal{c.peerName})
133+
return e(ctx, request)
134+
}
135+
return f
118136
}

http/client_mw.go

+24
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/WiFeng/go-sky/config"
1212
"github.com/WiFeng/go-sky/log"
13+
skyprome "github.com/WiFeng/go-sky/metrics/prometheus"
1314
kitopentracing "github.com/go-kit/kit/tracing/opentracing"
1415
"github.com/opentracing/opentracing-go"
1516
opentracingext "github.com/opentracing/opentracing-go/ext"
@@ -233,3 +234,26 @@ func RoundTripperLoggingMiddleware(next http.RoundTripper) http.RoundTripper {
233234
return
234235
})
235236
}
237+
238+
// RoundTripperTracingMiddleware ...
239+
func RoundTripperMetricsMiddleware(next http.RoundTripper) http.RoundTripper {
240+
return RoundTripperFunc(func(req *http.Request) (resp *http.Response, err error) {
241+
242+
var peer string
243+
val := req.Context().Value(clientContext)
244+
if contextVal, ok := val.(clientContextVal); ok {
245+
peer = contextVal.peerName
246+
}
247+
248+
defer func(begin time.Time) {
249+
duration := float64(time.Since(begin).Microseconds()) / 1000000
250+
251+
skyprome.HTTPClientRequestsTotalCounter(peer, resp.StatusCode, req.Method, req.URL.Path)
252+
skyprome.HTTPClientRequestsDurationHistogram(peer, resp.StatusCode, req.Method, req.URL.Path, duration)
253+
skyprome.HTTPClientRequestsDurationSummary(peer, resp.StatusCode, req.Method, req.URL.Path, duration)
254+
}(time.Now())
255+
256+
resp, err = next.RoundTrip(req)
257+
return
258+
})
259+
}

http/server_mw.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ func ServerMetricsMiddleware(next http.Handler) http.Handler {
131131
defer func(begin time.Time) {
132132
duration := float64(time.Since(begin).Microseconds()) / 1000000
133133

134-
skyprome.HTTPRequestsTotalCounter(iw.statusCode, r.Method, r.URL.Path)
135-
skyprome.HTTPRequestsDurationHistogram(duration)
136-
skyprome.HTTPRequestsDurationSummary(duration)
134+
skyprome.HTTPServerRequestsTotalCounter(iw.statusCode, r.Method, r.URL.Path)
135+
skyprome.HTTPServerRequestsDurationHistogram(iw.statusCode, r.Method, r.URL.Path, duration)
136+
skyprome.HTTPServerRequestsDurationSummary(iw.statusCode, r.Method, r.URL.Path, duration)
137137
}(time.Now())
138138

139139
next.ServeHTTP(iw, r)

log/logger.go

+22
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/WiFeng/go-sky/config"
99
"github.com/WiFeng/go-sky/helper"
10+
skyprome "github.com/WiFeng/go-sky/metrics/prometheus"
1011
"github.com/opentracing/opentracing-go"
1112
jaegerclient "github.com/uber/jaeger-client-go"
1213
"go.uber.org/zap"
@@ -201,126 +202,147 @@ func BuildLogger(ctx context.Context) context.Context {
201202
func Info(ctx context.Context, args ...interface{}) {
202203
logg := LoggerFromContext(ctx)
203204
logg.Info(args...)
205+
skyprome.LogCounter("INFO")
204206
}
205207

206208
// Infof ...
207209
func Infof(ctx context.Context, template string, args ...interface{}) {
208210
logg := LoggerFromContext(ctx)
209211
logg.Infof(template, args...)
212+
skyprome.LogCounter("INFO")
210213
}
211214

212215
// Infow ...
213216
func Infow(ctx context.Context, msg string, keysAndValues ...interface{}) {
214217
logg := LoggerFromContext(ctx)
215218
logg.Infow(msg, keysAndValues...)
219+
skyprome.LogCounter("INFO")
216220
}
217221

218222
// Debug ...
219223
func Debug(ctx context.Context, args ...interface{}) {
220224
logg := LoggerFromContext(ctx)
221225
logg.Debug(args...)
226+
skyprome.LogCounter("DEBUG")
222227
}
223228

224229
// Debugf ...
225230
func Debugf(ctx context.Context, template string, args ...interface{}) {
226231
logg := LoggerFromContext(ctx)
227232
logg.Debugf(template, args...)
233+
skyprome.LogCounter("DEBUG")
228234
}
229235

230236
// Debugw ...
231237
func Debugw(ctx context.Context, msg string, keysAndValues ...interface{}) {
232238
logg := LoggerFromContext(ctx)
233239
logg.Debugw(msg, keysAndValues...)
240+
skyprome.LogCounter("DEBUG")
234241
}
235242

236243
// Warn ...
237244
func Warn(ctx context.Context, args ...interface{}) {
238245
logg := LoggerFromContext(ctx)
239246
logg.Warn(args...)
247+
skyprome.LogCounter("WARN")
240248
}
241249

242250
// Warnf ...
243251
func Warnf(ctx context.Context, template string, args ...interface{}) {
244252
logg := LoggerFromContext(ctx)
245253
logg.Warnf(template, args...)
254+
skyprome.LogCounter("WARN")
246255
}
247256

248257
// Warnw ...
249258
func Warnw(ctx context.Context, msg string, keysAndValues ...interface{}) {
250259
logg := LoggerFromContext(ctx)
251260
logg.Warnw(msg, keysAndValues...)
261+
skyprome.LogCounter("WARN")
252262
}
253263

254264
// Error ...
255265
func Error(ctx context.Context, args ...interface{}) {
256266
logg := LoggerFromContext(ctx)
257267
logg.Error(args...)
268+
skyprome.LogCounter("ERROR")
258269
}
259270

260271
// Errorf ...
261272
func Errorf(ctx context.Context, template string, args ...interface{}) {
262273
logg := LoggerFromContext(ctx)
263274
logg.Errorf(template, args...)
275+
skyprome.LogCounter("ERROR")
264276
}
265277

266278
// Errorw ...
267279
func Errorw(ctx context.Context, msg string, keysAndValues ...interface{}) {
268280
logg := LoggerFromContext(ctx)
269281
logg.Errorw(msg, keysAndValues...)
282+
skyprome.LogCounter("ERROR")
270283
}
271284

272285
// DPanic ...
273286
func DPanic(ctx context.Context, args ...interface{}) {
274287
logg := LoggerFromContext(ctx)
275288
logg.DPanic(args...)
289+
skyprome.LogCounter("PANIC")
276290
}
277291

278292
// DPanicf ...
279293
func DPanicf(ctx context.Context, template string, args ...interface{}) {
280294
logg := LoggerFromContext(ctx)
281295
logg.DPanicf(template, args...)
296+
skyprome.LogCounter("PANIC")
282297
}
283298

284299
// DPanicw ...
285300
func DPanicw(ctx context.Context, msg string, keysAndValues ...interface{}) {
286301
logg := LoggerFromContext(ctx)
287302
logg.DPanicw(msg, keysAndValues...)
303+
skyprome.LogCounter("PANIC")
288304
}
289305

290306
// Panic ...
291307
func Panic(ctx context.Context, args ...interface{}) {
292308
logg := LoggerFromContext(ctx)
293309
logg.Panic(args...)
310+
skyprome.LogCounter("PANIC")
294311
}
295312

296313
// Panicf ...
297314
func Panicf(ctx context.Context, template string, args ...interface{}) {
298315
logg := LoggerFromContext(ctx)
299316
logg.Panicf(template, args...)
317+
skyprome.LogCounter("PANIC")
300318
}
301319

302320
// Panicw ...
303321
func Panicw(ctx context.Context, msg string, keysAndValues ...interface{}) {
304322
logg := LoggerFromContext(ctx)
305323
logg.Panicw(msg, keysAndValues...)
324+
skyprome.LogCounter("PANIC")
306325
}
307326

308327
// Fatal ...
309328
func Fatal(ctx context.Context, args ...interface{}) {
310329
logg := LoggerFromContext(ctx)
311330
logg.Fatal(args...)
331+
skyprome.LogCounter("FATAL")
312332
}
313333

314334
// Fatalf ...
315335
func Fatalf(ctx context.Context, template string, args ...interface{}) {
316336
logg := LoggerFromContext(ctx)
317337
logg.Fatalf(template, args...)
338+
skyprome.LogCounter("FATAL")
318339
}
319340

320341
// Fatalw ...
321342
func Fatalw(ctx context.Context, msg string, keysAndValues ...interface{}) {
322343
logg := LoggerFromContext(ctx)
323344
logg.Fatalw(msg, keysAndValues...)
345+
skyprome.LogCounter("FATAL")
324346
}
325347

326348
// Sync ...

metrics/metrics.go

+42-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,52 @@ package metrics
22

33
import (
44
"context"
5+
"net/http"
56

67
"github.com/WiFeng/go-sky/config"
7-
"github.com/WiFeng/go-sky/metrics/prometheus"
8+
"github.com/WiFeng/go-sky/log"
9+
"github.com/prometheus/client_golang/prometheus/promhttp"
10+
11+
skyprome "github.com/WiFeng/go-sky/metrics/prometheus"
812
)
913

1014
// Init ...
1115
func Init(ctx context.Context, serviceName string, cfg config.Metrics) {
12-
prometheus.Init(ctx, serviceName, cfg.Prometheus)
16+
initPrometheus(ctx, serviceName, cfg.Prometheus)
17+
}
18+
19+
// Init ...
20+
func initPrometheus(ctx context.Context, serviceName string, cfg config.Prometheus) {
21+
22+
if cfg.Addr == "" {
23+
return
24+
}
25+
26+
go func() {
27+
log.Infof(ctx, "Start HTTP Prometheus metrics. http://%s", cfg.Addr)
28+
log.Fatal(ctx, http.ListenAndServe(cfg.Addr, promhttp.Handler()))
29+
}()
30+
31+
if len(cfg.HTTPServerRequestsDurationHistogramBuckets) < 1 {
32+
cfg.HTTPServerRequestsDurationHistogramBuckets = skyprome.DefaultBuckets
33+
}
34+
35+
if len(cfg.HTTPServerRequestsDurationSummaryObjectives) < 1 {
36+
cfg.HTTPServerRequestsDurationSummaryObjectives = skyprome.DefaultObjectives
37+
}
38+
39+
if len(cfg.HTTPClientRequestsDurationHistogramBuckets) < 1 {
40+
cfg.HTTPClientRequestsDurationHistogramBuckets = skyprome.DefaultBuckets
41+
}
42+
43+
if len(cfg.HTTPClientRequestsDurationSummaryObjectives) < 1 {
44+
cfg.HTTPClientRequestsDurationSummaryObjectives = skyprome.DefaultObjectives
45+
}
46+
47+
skyprome.SetPromeCfg(cfg)
48+
skyprome.SetPromeService(serviceName)
49+
50+
skyprome.LogInit()
51+
skyprome.HttpServerInit()
52+
skyprome.HttpClientInit()
1353
}

0 commit comments

Comments
 (0)