func sumDuration(d1 time.Duration, d2 time.Duration) time.Duration { … } func maxDuration(d1 time.Duration, d2 time.Duration) time.Duration { … } type DurationTracker … type durationTracker … // Track measures time spent in given function and aggregates measured // duration using aggregateFunction func (t *durationTracker) Track(f func()) { … } // TrackDuration tracks latency from the given duration // using aggregateFunction func (t *durationTracker) TrackDuration(d time.Duration) { … } // GetLatency returns aggregated latency tracked by a tracker func (t *durationTracker) GetLatency() time.Duration { … } func newSumLatencyTracker(c clock.Clock) DurationTracker { … } func newMaxLatencyTracker(c clock.Clock) DurationTracker { … } type LatencyTrackers … type latencyTrackersKeyType … const latencyTrackersKey … // WithLatencyTrackers returns a copy of parent context to which an // instance of LatencyTrackers is added. func WithLatencyTrackers(parent context.Context) context.Context { … } // WithLatencyTrackersAndCustomClock returns a copy of parent context to which // an instance of LatencyTrackers is added. Tracers use given clock. func WithLatencyTrackersAndCustomClock(parent context.Context, c clock.Clock) context.Context { … } // LatencyTrackersFrom returns the associated LatencyTrackers instance // from the specified context. func LatencyTrackersFrom(ctx context.Context) (*LatencyTrackers, bool) { … } // TrackTransformResponseObjectLatency is used to track latency incurred // inside the function that takes an object returned from the underlying // storage layer (etcd) and performs any necessary transformations // of the response object. This does not include the latency incurred in // serialization (json or protobuf) of the response object or writing of // it to the http ResponseWriter object. // When called multiple times, the latency incurred inside the // transform func each time will be summed up. func TrackTransformResponseObjectLatency(ctx context.Context, transform func()) { … } // TrackStorageLatency is used to track latency incurred // inside the underlying storage layer. // When called multiple times, the latency provided will be summed up. func TrackStorageLatency(ctx context.Context, d time.Duration) { … } // TrackSerializeResponseObjectLatency is used to track latency incurred in // serialization (json or protobuf) of the response object. // When called multiple times, the latency provided will be summed up. func TrackSerializeResponseObjectLatency(ctx context.Context, f func()) { … } // TrackResponseWriteLatency is used to track latency incurred in writing // the serialized raw bytes to the http ResponseWriter object (via the // Write method) associated with the request. // When called multiple times, the latency provided will be summed up. func TrackResponseWriteLatency(ctx context.Context, d time.Duration) { … } // TrackAPFQueueWaitLatency is used to track latency incurred // by priority and fairness queues. func TrackAPFQueueWaitLatency(ctx context.Context, d time.Duration) { … } // TrackDecodeLatency is used to track latency incurred inside the function // that takes an object returned from the underlying storage layer // (etcd) and performs decoding of the response object. // When called multiple times, the latency incurred inside to // decode func each time will be summed up. func TrackDecodeLatency(ctx context.Context, d time.Duration) { … } // AuditAnnotationsFromLatencyTrackers will inspect each latency tracker // associated with the request context and return a set of audit // annotations that can be added to the API audit entry. func AuditAnnotationsFromLatencyTrackers(ctx context.Context) map[string]string { … }