Skip to content

Commit 34cd10c

Browse files
committed
support expose metrics for plugins
1 parent 982b45c commit 34cd10c

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed

api/pkg/filtermanager/config.go

+6
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,12 @@ func (p *FilterManagerConfigParser) Parse(any *anypb.Any, callbacks capi.ConfigC
216216

217217
for _, proto := range plugins {
218218
name := proto.Name
219+
220+
if registerMetrics := pkgPlugins.LoadMetricsCallback(name); registerMetrics != nil {
221+
registerMetrics(callbacks)
222+
api.LogInfof("loaded metrics definition for plugin %s", name)
223+
}
224+
219225
if plugin := pkgPlugins.LoadHTTPFilterFactoryAndParser(name); plugin != nil {
220226
config, err := plugin.ConfigParser.Parse(proto.Config)
221227
if err != nil {

api/pkg/plugins/plugins.go

+21
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import (
2020
"errors"
2121
"runtime/debug"
2222

23+
capi "github.com/envoyproxy/envoy/contrib/golang/common/go/api"
24+
2325
"mosn.io/htnn/api/internal/proto"
2426
"mosn.io/htnn/api/pkg/filtermanager/api"
2527
"mosn.io/htnn/api/pkg/log"
@@ -31,6 +33,7 @@ var (
3133
pluginTypes = map[string]Plugin{}
3234
plugins = map[string]Plugin{}
3335
httpFilterFactoryAndParser = map[string]*FilterFactoryAndParser{}
36+
metricsRegister = map[string]func(capi.ConfigCallbacks){}
3437
)
3538

3639
// Here we introduce extra struct to avoid cyclic import between pkg/filtermanager and pkg/plugins
@@ -188,6 +191,24 @@ func (cp *PluginConfigParser) Parse(any interface{}) (res interface{}, err error
188191
return conf, nil
189192
}
190193

194+
func RegisterMetricsCallback(pluginName string, registerMetricFunc func(capi.ConfigCallbacks)) {
195+
if registerMetricFunc == nil {
196+
panic("registerMetricFunc should not be nil")
197+
}
198+
if pluginName == "" {
199+
panic("pluginName should not be empty")
200+
}
201+
if _, ok := metricsRegister[pluginName]; ok {
202+
logger.Error(errors.New("metrics for plugin already registered, overriding"), "name", pluginName)
203+
}
204+
metricsRegister[pluginName] = registerMetricFunc
205+
logger.Info("registered metrics for plugin", "name", pluginName)
206+
}
207+
208+
func LoadMetricsCallback(pluginName string) func(capi.ConfigCallbacks) {
209+
return metricsRegister[pluginName]
210+
}
211+
191212
// PluginMethodDefaultImpl provides reasonable implementation for optional methods
192213
type PluginMethodDefaultImpl struct{}
193214

api/pkg/plugins/plugins_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"testing"
2121

2222
"github.com/agiledragon/gomonkey/v2"
23+
capi "github.com/envoyproxy/envoy/contrib/golang/common/go/api"
2324
"github.com/stretchr/testify/assert"
2425
"google.golang.org/protobuf/types/known/anypb"
2526

@@ -285,3 +286,8 @@ func TestRegisterPluginWithType(t *testing.T) {
285286
assert.NotNil(t, LoadPlugin("mock"))
286287
assert.NotNil(t, LoadPluginType("mock"))
287288
}
289+
290+
func TestRegisterPluginMetrics(t *testing.T) {
291+
RegisterMetricsCallback("mock", func(cc capi.ConfigCallbacks) {})
292+
assert.NotNil(t, LoadMetricsCallback("mock"))
293+
}

api/tests/integration/test_plugins.go

+17-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import (
2121
"strconv"
2222
"strings"
2323

24+
capi "github.com/envoyproxy/envoy/contrib/golang/common/go/api"
25+
2426
"mosn.io/htnn/api/pkg/filtermanager/api"
2527
"mosn.io/htnn/api/pkg/plugins"
2628
)
@@ -200,6 +202,7 @@ func (p *bufferPlugin) Factory() api.FilterFactory {
200202
type localReplyPlugin struct {
201203
plugins.PluginMethodDefaultImpl
202204
basePlugin
205+
usageCounter capi.CounterMetric
203206
}
204207

205208
func localReplyFactory(c interface{}, callbacks api.FilterCallbackHandler) api.Filter {
@@ -242,6 +245,9 @@ func (f *localReplyFilter) DecodeRequest(headers api.RequestHeaderMap, buf api.B
242245
f.reqHdr = headers
243246
f.runFilters = headers.Values("run")
244247
if f.config.Decode {
248+
if lrp.usageCounter != nil {
249+
lrp.usageCounter.Increment(1)
250+
}
245251
return f.NewLocalResponse("reply", true)
246252
}
247253
return api.Continue
@@ -309,6 +315,11 @@ func (p *localReplyPlugin) Factory() api.FilterFactory {
309315
return localReplyFactory
310316
}
311317

318+
func (p *localReplyPlugin) MetricsDefinition(c capi.ConfigCallbacks) {
319+
p.usageCounter = c.DefineCounterMetric("localreply.usage.counter")
320+
// Define more metrics here
321+
}
322+
312323
type badPlugin struct {
313324
plugins.PluginMethodDefaultImpl
314325
}
@@ -619,10 +630,15 @@ func (f *onLogFilter) OnLog(reqHeaders api.RequestHeaderMap, reqTrailers api.Req
619630
api.LogWarnf("receive request trailers: %+v", trailers)
620631
}
621632

633+
var lrp = &localReplyPlugin{}
634+
622635
func init() {
623636
plugins.RegisterPlugin("stream", &streamPlugin{})
624637
plugins.RegisterPlugin("buffer", &bufferPlugin{})
625-
plugins.RegisterPlugin("localReply", &localReplyPlugin{})
638+
639+
plugins.RegisterPlugin("localReply", lrp)
640+
plugins.RegisterMetricsCallback("localReply", lrp.MetricsDefinition)
641+
626642
plugins.RegisterPlugin("bad", &badPlugin{})
627643
plugins.RegisterPlugin("consumer", &consumerPlugin{})
628644
plugins.RegisterPlugin("init", &initPlugin{})

0 commit comments

Comments
 (0)