Skip to main content
Glama
api_call_metric.go1.87 kB
package metrics import ( "context" "fmt" "sync" "github.com/rs/zerolog/log" "go.opentelemetry.io/otel/metric" ) type apiCallCountMetricManager struct { mu sync.Mutex apiCallCountObserver metric.Int64ObservableCounter labelManager *LabelManager discoveryParser *discoveryStateParser } func newAPICallMetricManager( meter metric.Meter, labelManager *LabelManager, ) (*apiCallCountMetricManager, error) { mng := &apiCallCountMetricManager{ mu: sync.Mutex{}, labelManager: labelManager, } var err error mng.discoveryParser, err = newDiscoveryStateParser() if err != nil { return nil, fmt.Errorf("failed to initialize discovery state parser: %w", err) } meterObj, err := meter.Int64ObservableCounter( string(APICallCountMetric), metric.WithDescription("The number of API calls"), metric.WithInt64Callback(mng.apiCallCountCallback), ) if err != nil { log.Error().Err(err).Msg("Failed to create API calls count observer") return nil, err } mng.apiCallCountObserver = meterObj return mng, nil } func (m *apiCallCountMetricManager) apiCallCountCallback( _ context.Context, observer metric.Int64Observer, ) error { m.mu.Lock() defer m.mu.Unlock() return m.collectMetrics(observer) } func (m *apiCallCountMetricManager) collectMetrics(observer metric.Int64Observer) error { data, err := m.discoveryParser.ReadAndParseDiscovery() if err != nil { log.Error().Err(err).Msg("Failed to read and parse JSON file") return err } for consumer, endpointMap := range data.NewConsumerData { for endpoint, endpointAgg := range endpointMap { for statusCode, count := range endpointAgg.StatusCodes { labels := m.labelManager.GetAttributesFromDiscoveryEndpoint(endpoint, consumer, statusCode) observer.Observe(int64(count), metric.WithAttributes(labels...)) } } } return nil }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TheLunarCompany/lunar'

If you have feedback or need assistance with the MCP directory API, please join our Discord server