## Motivation and Context - It is important to have basic observability in place so that availability issues can be figured out easily ## How Has This Been Tested? - Registration of metrics is tested - Prometheus endpoint `/metrics` is included in test cases to test the metrics exposed - Test locally to understand any regression. ## Breaking Changes - No ## Types of changes <!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply: --> - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update ## Checklist <!-- Go over all the following points, and put an `x` in all the boxes that apply. --> - [x] I have read the [MCP Documentation](https://modelcontextprotocol.io) - [x] My code follows the repository's style guidelines - [x] New and existing tests pass locally - [x] I have added appropriate error handling - [ ] I have added or updated documentation as needed ## Additional context - Telemetry implementation is currently done by keeping metrics in mind as of now, other types of telemetry can be added on top of it later. - Instrumentation takes care of these problems already: - Cardinality control by limiting latency buckets and not including labels that grows with throughput. - Latency buckets are added as per SLA guidelines - Each metric prefixed with `mcp` to easily identify. - Pulling mechanism is used since the idea is to scrape metrics via an agent like vmagent, prometheus agent or otel-collector. - Metrics follow standard approach of defining counters, histogram and gauges as per opentelemetry guidelines.
86 lines
2.1 KiB
Go
86 lines
2.1 KiB
Go
package v0_test
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/danielgtaylor/huma/v2"
|
|
"github.com/danielgtaylor/huma/v2/adapters/humago"
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
v0 "github.com/modelcontextprotocol/registry/internal/api/handlers/v0"
|
|
"github.com/modelcontextprotocol/registry/internal/config"
|
|
"github.com/modelcontextprotocol/registry/internal/telemetry"
|
|
)
|
|
|
|
func TestHealthEndpoint(t *testing.T) {
|
|
// Test cases
|
|
testCases := []struct {
|
|
name string
|
|
config *config.Config
|
|
expectedStatus int
|
|
expectedBody v0.HealthBody
|
|
}{
|
|
{
|
|
name: "returns health status with github client id",
|
|
config: &config.Config{
|
|
GithubClientID: "test-github-client-id",
|
|
},
|
|
expectedStatus: http.StatusOK,
|
|
expectedBody: v0.HealthBody{
|
|
Status: "ok",
|
|
GitHubClientID: "test-github-client-id",
|
|
},
|
|
},
|
|
{
|
|
name: "returns health status without github client id",
|
|
config: &config.Config{
|
|
GithubClientID: "",
|
|
},
|
|
expectedStatus: http.StatusOK,
|
|
expectedBody: v0.HealthBody{
|
|
Status: "ok",
|
|
GitHubClientID: "",
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
// Create a new test API
|
|
mux := http.NewServeMux()
|
|
api := humago.New(mux, huma.DefaultConfig("Test API", "1.0.0"))
|
|
|
|
shutdownTelemetry, metrics, _ := telemetry.InitMetrics("test")
|
|
|
|
// Register the health endpoint
|
|
v0.RegisterHealthEndpoint(api, tc.config, metrics)
|
|
|
|
// Create a test request
|
|
req := httptest.NewRequest(http.MethodGet, "/v0/health", nil)
|
|
w := httptest.NewRecorder()
|
|
|
|
// Serve the request
|
|
mux.ServeHTTP(w, req)
|
|
|
|
// shut down the metric provider
|
|
_ = shutdownTelemetry(context.Background())
|
|
|
|
// Check the status code
|
|
assert.Equal(t, tc.expectedStatus, w.Code)
|
|
|
|
// Check the response body
|
|
// Since Huma adds a $schema field, we'll check individual fields
|
|
body := w.Body.String()
|
|
assert.Contains(t, body, `"status":"ok"`)
|
|
|
|
if tc.config.GithubClientID != "" {
|
|
assert.Contains(t, body, `"github_client_id":"test-github-client-id"`)
|
|
} else {
|
|
assert.NotContains(t, body, `"github_client_id"`)
|
|
}
|
|
})
|
|
}
|
|
}
|