Graphite: Backend version endpoint (#110774)

* Add lint rules

* Backend decoupling

- Add standalone files
- Add graphite query type
- Add logger to Service
- Create logger in the ProvideService method
- Use a pointer for the HTTP client provider
- Update logger usage everywhere
- Update tracer type
- Replace simplejson with json
- Add dummy CallResource and CheckHealth methods
- Update tests

* Update ConfigEditor imports

* Update types imports

* Update datasource

- Switch to using semver package
- Update imports

* Update store imports

* Update helper imports and notification creation

* Update context import

* Update version numbers and logic

* Copy array_move from core

* Test updates

* Add required files and update plugin.json

* Update core references and packages

* Remove commented code

* Update wire

* Lint

* Fix import

* Copy null type

* More lint

* Update snapshot

* Refactor backend

- Split query logic into separate file
- Move utils to separate file

* Add health-check logic

- Support backend healthcheck if the FF is enabled

* Remove query import support as unneeded

* Add test

* Add util function for decoding responses

* Add events types

* Add resource handler

* Add events handler and generic resource req handler

* Tests

* Update frontend

- Add types
- Update events function to support backend requests

* Lint and typing

* Lint

* Add metrics find endpoint

- Add types
- Add generic response parser
- Add endpoint
- Tests

* Update FE functoin to use backend endpoint

* Lint

* Simplify request

* Update test

* Metrics expand type

* Extract shared logic and add metric expand endpoint

* Update tests

* Call metric expand from backend

* Rename type for clarity

* Add get resource req handler

* Refactor doGraphiteRequest, parseResponse

Update tests

* Migrate functions endpoint to backend

* Support tags autocomplete in backend

- Add tests
- Add types
- Remove unneeded comments

* Support tag values autocomplete

- Remove unused frontend endpoints
- Add types
- Update tests

* Support the version endpoint

* Add tests

* Review

* Review

* Fix packages

* Format

* Fix merge issues

* Review

* Fix undefined values

* Extract request creation

- Add method for create requests generically with tests
- Replace usage in query method
- Update usages in resource handlers
- Update tests
- Update types
This commit is contained in:
Andreas Christou
2025-09-15 12:56:08 +01:00
committed by GitHub
parent 90f682151a
commit 5d48747fea
3 changed files with 109 additions and 7 deletions
@@ -620,6 +620,86 @@ func TestHandleTagValuesAutocomplete(t *testing.T) {
})
}
}
func TestHandleVersion(t *testing.T) {
tests := []struct {
name string
responseBody string
statusCode int
expectError bool
errorContains string
expectedData string
}{
{
name: "successful version request",
responseBody: `"1.1.10"`,
statusCode: 200,
expectedData: "1.1.10",
},
{
name: "version with build info",
responseBody: `"1.1.10-pre1"`,
statusCode: 200,
expectedData: "1.1.10-pre1",
},
{
name: "version request server error - invalid JSON causes parse error",
responseBody: `{"error": "internal error"}`,
statusCode: 500,
expectError: true,
errorContains: "version request failed",
},
{
name: "version request not found - invalid JSON causes parse error",
responseBody: `{"error": "not found"}`,
statusCode: 404,
expectError: true,
errorContains: "version request failed",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
mockTransport := &mockRoundTripper{
respBody: []byte(tt.responseBody),
status: tt.statusCode,
}
dsInfo := &datasourceInfo{
HTTPClient: &http.Client{Transport: mockTransport},
URL: "http://graphite.example.com",
}
service := &Service{
logger: log.NewNullLogger(),
}
result, statusCode, err := service.handleVersion(context.Background(), dsInfo, nil)
if tt.expectError {
assert.Error(t, err)
if tt.errorContains != "" {
assert.Contains(t, err.Error(), tt.errorContains)
}
} else {
assert.NoError(t, err)
assert.Equal(t, tt.statusCode, statusCode)
var version string
err = json.Unmarshal(result, &version)
assert.NoError(t, err)
assert.Equal(t, tt.expectedData, version)
}
if !tt.expectError {
expectedURL := "http://graphite.example.com/version"
assert.Equal(t, expectedURL, mockTransport.lastRequest.URL.String())
assert.Equal(t, http.MethodGet, mockTransport.lastRequest.Method)
}
})
}
}
func TestHandleFunctions(t *testing.T) {
tests := []struct {
name string