internal/registry/registry.go (64 lines of code) (raw):

// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package registry import ( "fmt" "github.com/elastic/go-sysinfo/types" ) type ( HostOptsCreator = func(ProviderOptions) HostProvider ProcessOptsCreator = func(ProviderOptions) ProcessProvider ) // HostProvider defines interfaces that provide host-specific metrics type HostProvider interface { Host() (types.Host, error) } // ProcessProvider defines interfaces that provide process-specific metrics type ProcessProvider interface { Processes() ([]types.Process, error) Process(pid int) (types.Process, error) Self() (types.Process, error) } type ProviderOptions struct { Hostfs string } var ( hostProvider HostProvider processProvider ProcessProvider processProviderWithOpts ProcessOptsCreator hostProviderWithOpts HostOptsCreator ) // Register a metrics provider. `provider` should implement one or more of `ProcessProvider` or `HostProvider` func Register(provider interface{}) { if h, ok := provider.(ProcessOptsCreator); ok { if processProviderWithOpts != nil { panic(fmt.Sprintf("ProcessOptsCreator already registered: %T", processProviderWithOpts)) } processProviderWithOpts = h } if h, ok := provider.(HostOptsCreator); ok { if hostProviderWithOpts != nil { panic(fmt.Sprintf("HostOptsCreator already registered: %T", hostProviderWithOpts)) } hostProviderWithOpts = h } if h, ok := provider.(HostProvider); ok { if hostProvider != nil { panic(fmt.Sprintf("HostProvider already registered: %v", hostProvider)) } hostProvider = h } if p, ok := provider.(ProcessProvider); ok { if processProvider != nil { panic(fmt.Sprintf("ProcessProvider already registered: %v", processProvider)) } processProvider = p } } // GetHostProvider returns the HostProvider registered for the system. May return nil. func GetHostProvider(opts ProviderOptions) HostProvider { if hostProviderWithOpts != nil { return hostProviderWithOpts(opts) } return hostProvider } // GetProcessProvider returns the ProcessProvider registered on the system. May return nil. func GetProcessProvider(opts ProviderOptions) ProcessProvider { if processProviderWithOpts != nil { return processProviderWithOpts(opts) } return processProvider }