mirror of
https://github.com/grafana/grafana.git
synced 2025-02-15 10:03:33 -06:00
* Create historian metrics and dependency inject * Record counter for total number of state transitions logged * Track write failures * Track current number of active write goroutines * Record histogram of how long it takes to write history data * Don't copy the registerer * Adjust naming of write failures metric * Introduce WritesTotal to complement WritesFailedTotal * Measure TransitionsFailedTotal to complement TransitionsTotal * Rename all to state_history * Remove redundant Total suffix * Increment totals all the time, not just on success * Drop ActiveWriteGoroutines * Drop PersistDuration in favor of WriteDuration * Drop unused gauge * Make writes and writesFailed per org * Add metric indicating backend and a spot for future metadata * Drop _batch_ from names and update help * Add metric for bytes written * Better pairing of total + failure metric updates * Few tweaks to wording and naming * Record info metric during composition * Create fakeRequester and simple happy path test using it * Blocking test for the full historian and test for happy path metrics * Add tests for failure case metrics * Smoke test for full annotation persistence * Create test for metrics on annotation persistence, both happy and failing paths * Address linter complaints * More linter complaints * Remove unnecessary whitespace * Consistency improvements to help texts * Update tests to match new descs
50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
package historian
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
|
|
"github.com/grafana/grafana/pkg/services/annotations"
|
|
)
|
|
|
|
type fakeRequester struct {
|
|
lastRequest *http.Request
|
|
resp *http.Response
|
|
}
|
|
|
|
func NewFakeRequester() *fakeRequester {
|
|
return &fakeRequester{
|
|
resp: &http.Response{
|
|
Status: "200 OK",
|
|
StatusCode: 200,
|
|
Body: io.NopCloser(bytes.NewBufferString("")),
|
|
ContentLength: int64(0),
|
|
Header: make(http.Header, 0),
|
|
},
|
|
}
|
|
}
|
|
|
|
func (f *fakeRequester) WithResponse(resp *http.Response) *fakeRequester {
|
|
f.resp = resp
|
|
return f
|
|
}
|
|
|
|
func (f *fakeRequester) Do(req *http.Request) (*http.Response, error) {
|
|
f.lastRequest = req
|
|
f.resp.Request = req // Not concurrency-safe!
|
|
return f.resp, nil
|
|
}
|
|
|
|
type failingAnnotationRepo struct{}
|
|
|
|
func (f *failingAnnotationRepo) SaveMany(_ context.Context, _ []annotations.Item) error {
|
|
return fmt.Errorf("failed to save annotations")
|
|
}
|
|
|
|
func (f *failingAnnotationRepo) Find(_ context.Context, _ *annotations.ItemQuery) ([]*annotations.ItemDTO, error) {
|
|
return nil, fmt.Errorf("failed to query annotations")
|
|
}
|