internal/satellite/telemetry/prometheus/timer.go (47 lines of code) (raw):

// Licensed to Apache Software Foundation (ASF) under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Apache Software Foundation (ASF) 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 prometheus import ( "sync" "time" "github.com/apache/skywalking-satellite/internal/satellite/telemetry" ) var timerLocker sync.Mutex type Timer struct { Collector name string sumCounter telemetry.Counter countCounter telemetry.Counter } type TimeRecorder struct { timer *Timer startTime time.Time labelValues []string } // NewCounter create a new counter if no metric with the same name exists. func (s *Server) NewTimer(name, help string, labels ...string) telemetry.Timer { timerLocker.Lock() defer timerLocker.Unlock() collector, ok := s.collectorContainer[name] if !ok { timer := &Timer{ name: name, sumCounter: s.NewCounter(name+"_sum", help, labels...), countCounter: s.NewCounter(name+"_count", help, labels...), } s.collectorContainer[name] = timer collector = timer } return collector.(telemetry.Timer) } // Start a new time recorder func (c *Timer) Start(labelValues ...string) telemetry.TimeRecorder { return &TimeRecorder{ timer: c, startTime: time.Now(), labelValues: labelValues, } } // AddTime add a new duration and count func (c *Timer) AddTime(t time.Duration, labelValues ...string) { c.sumCounter.Add(float64(t.Milliseconds()), labelValues...) c.countCounter.Inc(labelValues...) } // Stop the time and record the time func (c *TimeRecorder) Stop() { c.timer.AddTime(time.Since(c.startTime), c.labelValues...) }