91 lines
1.9 KiB
Go
91 lines
1.9 KiB
Go
package jaeger
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
|
"github.com/grafana/grafana-plugin-sdk-go/backend/log"
|
|
)
|
|
|
|
type JaegerClient struct {
|
|
logger log.Logger
|
|
url string
|
|
httpClient *http.Client
|
|
}
|
|
|
|
type ServicesResponse struct {
|
|
Data []string `json:"data"`
|
|
Errors interface{} `json:"errors"`
|
|
Limit int `json:"limit"`
|
|
Offset int `json:"offset"`
|
|
Total int `json:"total"`
|
|
}
|
|
|
|
func New(url string, hc *http.Client, logger log.Logger) (JaegerClient, error) {
|
|
client := JaegerClient{
|
|
logger: logger,
|
|
url: url,
|
|
httpClient: hc,
|
|
}
|
|
return client, nil
|
|
}
|
|
|
|
func (j *JaegerClient) Services() ([]string, error) {
|
|
var response ServicesResponse
|
|
services := []string{}
|
|
|
|
u, err := url.JoinPath(j.url, "/api/services")
|
|
if err != nil {
|
|
return services, backend.DownstreamError(fmt.Errorf("failed to join url: %w", err))
|
|
}
|
|
|
|
res, err := j.httpClient.Get(u)
|
|
if err != nil {
|
|
return services, err
|
|
}
|
|
|
|
defer func() {
|
|
if err = res.Body.Close(); err != nil {
|
|
j.logger.Error("Failed to close response body", "error", err)
|
|
}
|
|
}()
|
|
|
|
if err := json.NewDecoder(res.Body).Decode(&response); err != nil {
|
|
return services, err
|
|
}
|
|
|
|
services = response.Data
|
|
return services, err
|
|
}
|
|
|
|
func (j *JaegerClient) Operations(s string) ([]string, error) {
|
|
var response ServicesResponse
|
|
operations := []string{}
|
|
|
|
u, err := url.JoinPath(j.url, "/api/services/", s, "/operations")
|
|
if err != nil {
|
|
return operations, backend.DownstreamError(fmt.Errorf("failed to join url: %w", err))
|
|
}
|
|
|
|
res, err := j.httpClient.Get(u)
|
|
if err != nil {
|
|
return operations, err
|
|
}
|
|
|
|
defer func() {
|
|
if err = res.Body.Close(); err != nil {
|
|
j.logger.Error("Failed to close response body", "error", err)
|
|
}
|
|
}()
|
|
|
|
if err := json.NewDecoder(res.Body).Decode(&response); err != nil {
|
|
return operations, err
|
|
}
|
|
|
|
operations = response.Data
|
|
return operations, err
|
|
}
|