mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-10-18 04:41:29 +08:00

* feat(organization): add hname and alias for organization * fix: boolean values are not shown in the list panel's column * fix: moved logic to component level * fix: added type * fix: added test cases * fix: added test cases * chore: update copy webpack plugin * Revert "fix: display same key with multiple data types in filter suggestions by enhancing the deduping logic (#7255)" This reverts commit 1e85981a17a8e715e948308d3e85072d976907d3. * fix: use query search v2 for traces data source to handle multiple data types for the same key * fix(QueryBuilderSearchV2): add user typed option if it doesn't exist in the payload * fix(QueryBuilderSearchV2): increase the height of search dropdown for non-logs data sources * fix: display span scope selector for trace data source * chore: remove the span scope selector from qb search v1 and move the component to search v2 * fix: write test to ensure that we display span scope selector for traces data source * fix: limit converting -> only to log data source * fix: don't display empty suggestion if only spaces are typed * chore: tests for span scope selector * chore: qb search flow (key, operator, value) test cases * refactor: fix the Maximum update depth reached issue while running tests * chore: overall improvements to span scope selector tests Resource attr filter: style fix and quick filter changes (#7691) * chore: resource attr filter init * chore: resource attr filter api integration * chore: operator config updated * chore: fliter show hide logic and styles * chore: add support for custom operator list to qb * chore: minor refactor * chore: minor code refactor * test: quick filters test suite added * test: quick filters test suite added * test: all errors test suite added * chore: style fix * test: all errors mock fix * chore: test case fix and mixpanel update * chore: color update * chore: minor refactor * chore: style fix * chore: set default query in exceptions tab * chore: style fix * chore: minor refactor * chore: minor refactor * chore: minor refactor * chore: test update * chore: fix filter header with no query name * fix: scroll fix * chore: add data source traces to quick filters * chore: replace div with fragment --------- Co-authored-by: Aditya Singh <adityasingh@Adityas-MacBook-Pro.local> fix: handle rate operators for table panel (#7695) * fix: handle rate operators for table panel chore: fix error rate (#7701) Signed-off-by: Shivanshu Raj Shrivastava <shivanshu1333@gmail.com> * feat(organization): minor cleanups * feat(organization): better naming for api and usecase * feat(organization): better packaging for modules * feat(organization): change hname to displayName * feat(organization): update the migration to use dialect * feat(organization): update the migration to use dialect * feat(organization): update the migration to use dialect * feat(organization): revert back to impl * feat(organization): remove DI from organization * feat(organization): address review comments * feat(organization): address review comments * feat(organization): address review comments --------- Signed-off-by: Shivanshu Raj Shrivastava <shivanshu1333@gmail.com>
223 lines
6.5 KiB
Go
223 lines
6.5 KiB
Go
package signozio
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/SigNoz/signoz/ee/query-service/constants"
|
|
"github.com/SigNoz/signoz/ee/query-service/model"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
var C *Client
|
|
|
|
const (
|
|
POST = "POST"
|
|
APPLICATION_JSON = "application/json"
|
|
)
|
|
|
|
type Client struct {
|
|
Prefix string
|
|
GatewayUrl string
|
|
}
|
|
|
|
func New() *Client {
|
|
return &Client{
|
|
Prefix: constants.LicenseSignozIo,
|
|
GatewayUrl: constants.ZeusURL,
|
|
}
|
|
}
|
|
|
|
func init() {
|
|
C = New()
|
|
}
|
|
|
|
func ValidateLicenseV3(licenseKey string) (*model.LicenseV3, *model.ApiError) {
|
|
|
|
// Creating an HTTP client with a timeout for better control
|
|
client := &http.Client{
|
|
Timeout: 10 * time.Second,
|
|
}
|
|
|
|
req, err := http.NewRequest("GET", C.GatewayUrl+"/v2/licenses/me", nil)
|
|
if err != nil {
|
|
return nil, model.BadRequest(errors.Wrap(err, "failed to create request"))
|
|
}
|
|
|
|
// Setting the custom header
|
|
req.Header.Set("X-Signoz-Cloud-Api-Key", licenseKey)
|
|
|
|
response, err := client.Do(req)
|
|
if err != nil {
|
|
return nil, model.BadRequest(errors.Wrap(err, "failed to make post request"))
|
|
}
|
|
|
|
body, err := io.ReadAll(response.Body)
|
|
if err != nil {
|
|
return nil, model.BadRequest(errors.Wrap(err, fmt.Sprintf("failed to read validation response from %v", C.GatewayUrl)))
|
|
}
|
|
|
|
defer response.Body.Close()
|
|
|
|
switch response.StatusCode {
|
|
case 200:
|
|
a := ValidateLicenseResponse{}
|
|
err = json.Unmarshal(body, &a)
|
|
if err != nil {
|
|
return nil, model.BadRequest(errors.Wrap(err, "failed to marshal license validation response"))
|
|
}
|
|
|
|
license, err := model.NewLicenseV3(a.Data)
|
|
if err != nil {
|
|
return nil, model.BadRequest(errors.Wrap(err, "failed to generate new license v3"))
|
|
}
|
|
|
|
return license, nil
|
|
case 400:
|
|
return nil, model.BadRequest(errors.Wrap(fmt.Errorf(string(body)),
|
|
fmt.Sprintf("bad request error received from %v", C.GatewayUrl)))
|
|
case 401:
|
|
return nil, model.Unauthorized(errors.Wrap(fmt.Errorf(string(body)),
|
|
fmt.Sprintf("unauthorized request error received from %v", C.GatewayUrl)))
|
|
default:
|
|
return nil, model.InternalError(errors.Wrap(fmt.Errorf(string(body)),
|
|
fmt.Sprintf("internal request error received from %v", C.GatewayUrl)))
|
|
}
|
|
|
|
}
|
|
|
|
func NewPostRequestWithCtx(ctx context.Context, url string, contentType string, body io.Reader) (*http.Request, error) {
|
|
req, err := http.NewRequestWithContext(ctx, POST, url, body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
req.Header.Add("Content-Type", contentType)
|
|
return req, err
|
|
|
|
}
|
|
|
|
// SendUsage reports the usage of signoz to license server
|
|
func SendUsage(ctx context.Context, usage model.UsagePayload) *model.ApiError {
|
|
reqString, _ := json.Marshal(usage)
|
|
req, err := NewPostRequestWithCtx(ctx, C.Prefix+"/usage", APPLICATION_JSON, bytes.NewBuffer(reqString))
|
|
if err != nil {
|
|
return model.BadRequest(errors.Wrap(err, "unable to create http request"))
|
|
}
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return model.BadRequest(errors.Wrap(err, "unable to connect with license.signoz.io, please check your network connection"))
|
|
}
|
|
|
|
body, err := io.ReadAll(res.Body)
|
|
if err != nil {
|
|
return model.BadRequest(errors.Wrap(err, "failed to read usage response from license.signoz.io"))
|
|
}
|
|
|
|
defer res.Body.Close()
|
|
|
|
switch res.StatusCode {
|
|
case 200, 201:
|
|
return nil
|
|
case 400, 401:
|
|
return model.BadRequest(errors.Wrap(errors.New(string(body)),
|
|
"bad request error received from license.signoz.io"))
|
|
default:
|
|
return model.InternalError(errors.Wrap(errors.New(string(body)),
|
|
"internal error received from license.signoz.io"))
|
|
}
|
|
}
|
|
|
|
func CheckoutSession(ctx context.Context, checkoutRequest *model.CheckoutRequest, licenseKey string) (string, *model.ApiError) {
|
|
hClient := &http.Client{}
|
|
|
|
reqString, err := json.Marshal(checkoutRequest)
|
|
if err != nil {
|
|
return "", model.BadRequest(err)
|
|
}
|
|
|
|
req, err := http.NewRequestWithContext(ctx, "POST", C.GatewayUrl+"/v2/subscriptions/me/sessions/checkout", bytes.NewBuffer(reqString))
|
|
if err != nil {
|
|
return "", model.BadRequest(err)
|
|
}
|
|
req.Header.Set("X-Signoz-Cloud-Api-Key", licenseKey)
|
|
|
|
response, err := hClient.Do(req)
|
|
if err != nil {
|
|
return "", model.BadRequest(err)
|
|
}
|
|
body, err := io.ReadAll(response.Body)
|
|
if err != nil {
|
|
return "", model.BadRequest(errors.Wrap(err, fmt.Sprintf("failed to read checkout response from %v", C.GatewayUrl)))
|
|
}
|
|
defer response.Body.Close()
|
|
|
|
switch response.StatusCode {
|
|
case 201:
|
|
a := CheckoutResponse{}
|
|
err = json.Unmarshal(body, &a)
|
|
if err != nil {
|
|
return "", model.BadRequest(errors.Wrap(err, "failed to unmarshal zeus checkout response"))
|
|
}
|
|
return a.Data.RedirectURL, nil
|
|
case 400:
|
|
return "", model.BadRequest(errors.Wrap(errors.New(string(body)),
|
|
fmt.Sprintf("bad request error received from %v", C.GatewayUrl)))
|
|
case 401:
|
|
return "", model.Unauthorized(errors.Wrap(errors.New(string(body)),
|
|
fmt.Sprintf("unauthorized request error received from %v", C.GatewayUrl)))
|
|
default:
|
|
return "", model.InternalError(errors.Wrap(errors.New(string(body)),
|
|
fmt.Sprintf("internal request error received from %v", C.GatewayUrl)))
|
|
}
|
|
}
|
|
|
|
func PortalSession(ctx context.Context, checkoutRequest *model.PortalRequest, licenseKey string) (string, *model.ApiError) {
|
|
hClient := &http.Client{}
|
|
|
|
reqString, err := json.Marshal(checkoutRequest)
|
|
if err != nil {
|
|
return "", model.BadRequest(err)
|
|
}
|
|
|
|
req, err := http.NewRequestWithContext(ctx, "POST", C.GatewayUrl+"/v2/subscriptions/me/sessions/portal", bytes.NewBuffer(reqString))
|
|
if err != nil {
|
|
return "", model.BadRequest(err)
|
|
}
|
|
req.Header.Set("X-Signoz-Cloud-Api-Key", licenseKey)
|
|
|
|
response, err := hClient.Do(req)
|
|
if err != nil {
|
|
return "", model.BadRequest(err)
|
|
}
|
|
body, err := io.ReadAll(response.Body)
|
|
if err != nil {
|
|
return "", model.BadRequest(errors.Wrap(err, fmt.Sprintf("failed to read portal response from %v", C.GatewayUrl)))
|
|
}
|
|
defer response.Body.Close()
|
|
|
|
switch response.StatusCode {
|
|
case 201:
|
|
a := CheckoutResponse{}
|
|
err = json.Unmarshal(body, &a)
|
|
if err != nil {
|
|
return "", model.BadRequest(errors.Wrap(err, "failed to unmarshal zeus portal response"))
|
|
}
|
|
return a.Data.RedirectURL, nil
|
|
case 400:
|
|
return "", model.BadRequest(errors.Wrap(errors.New(string(body)),
|
|
fmt.Sprintf("bad request error received from %v", C.GatewayUrl)))
|
|
case 401:
|
|
return "", model.Unauthorized(errors.Wrap(errors.New(string(body)),
|
|
fmt.Sprintf("unauthorized request error received from %v", C.GatewayUrl)))
|
|
default:
|
|
return "", model.InternalError(errors.Wrap(errors.New(string(body)),
|
|
fmt.Sprintf("internal request error received from %v", C.GatewayUrl)))
|
|
}
|
|
}
|