mirror of
https://github.com/hanzoai/o11y.git
synced 2026-10-15 12:58:33 +00:00
# Conflicts: # .github/workflows/build-community.yaml # .github/workflows/build-enterprise.yaml # .github/workflows/gor-signoz-community.yaml # cmd/community/Dockerfile # cmd/community/Dockerfile.multi-arch # cmd/community/main.go # cmd/community/server.go # cmd/enterprise/Dockerfile # cmd/enterprise/Dockerfile.integration # cmd/enterprise/Dockerfile.with-web.integration # cmd/server/metastore.go # cmd/zap.go # conf/prometheus.yml # deploy/docker-swarm/generator/hotrod/docker-compose.yaml # deploy/docker-swarm/generator/infra/docker-compose.yaml # deploy/docker-swarm/generator/infra/otel-agent-config.yaml # deploy/docker-swarm/generator/infra/otel-metrics-config.yaml # deploy/docker/generator/hotrod/docker-compose.yaml # deploy/docker/generator/infra/docker-compose.yaml # deploy/docker/generator/infra/otel-collector-config.yaml # docs/contributing/go/integration.md # ee/anomaly/hourly.go # ee/anomaly/params.go # ee/anomaly/seasonal.go # ee/authn/callbackauthn/oidccallbackauthn/authn.go # ee/authz/openfgaauthz/provider.go # ee/authz/openfgaschema/base.fga # ee/authz/openfgaserver/server.go # ee/licensing/config.go # ee/licensing/httplicensing/provider.go # ee/modules/dashboard/impldashboard/module.go # ee/querier/handler.go # ee/query-service/anomaly/seasonal.go # ee/query-service/app/api/cloudIntegrations.go # ee/query-service/app/api/featureFlags.go # ee/query-service/app/api/license.go # ee/query-service/app/api/queryrange.go # ee/query-service/rules/anomaly.go # ee/query-service/rules/anomaly_test.go # ee/query-service/rules/manager.go # ee/query-service/rules/manager_test.go # ee/query-service/usage/manager.go # ee/sqlschema/postgressqlschema/provider.go # ee/sqlstore/postgressqlstore/dialect.go # ee/sqlstore/postgressqlstore/provider.go # ee/zeus/config.go # ee/zeus/httpzeus/provider.go # frontend/.eslintrc.cjs # frontend/e2e/test-plan/README.md # frontend/e2e/test-plan/validation-report.md # frontend/e2e/tests/settings/account-settings/account-settings-settings.spec.ts # frontend/e2e/tests/settings/api-keys/api-keys-settings.spec.ts # frontend/playwright.config.ts # frontend/public/Images/signoz-hero-image.webp # frontend/public/Logos/signoz-brand-logo.svg # frontend/scripts/generate-permissions-type.cjs # frontend/src/assets/Images/o11y-hero-image.webp # frontend/src/assets/Images/signoz-hero-image.webp # frontend/src/assets/Logos/hanzo-brand-logo.svg # frontend/src/assets/Logos/hanzo-icon.svg # frontend/src/assets/Logos/o11y-brand-logo.svg # frontend/src/assets/Logos/signoz-brand-logo.svg # frontend/src/assets/SigNoz-dark.svg # frontend/src/assets/SigNoz-white.svg # frontend/src/assets/signoz.svg # frontend/src/components/DetailsDrawer/DetailsDrawer.styles.scss # frontend/src/components/HostMetricsDetail/HostMetricTraces/HostMetricTraces.styles.scss # frontend/src/components/HostMetricsDetail/HostMetricTraces/constants.ts # frontend/src/components/HostMetricsDetail/HostMetricsDetail.styles.scss # frontend/src/components/HostMetricsDetail/HostMetricsDetails.tsx # frontend/src/components/HostMetricsDetail/HostMetricsLogs/NoLogsContainer.tsx # frontend/src/components/HostMetricsDetail/HostMetricsLogs/constants.ts # frontend/src/components/LogsDownloadOptionsMenu/LogsDownloadOptionsMenu.styles.scss # frontend/src/components/WelcomeLeftContainer/index.tsx # frontend/src/container/APIKeys/APIKeys.styles.scss # frontend/src/container/APIKeys/APIKeys.test.tsx # frontend/src/container/APIKeys/APIKeys.tsx # frontend/src/container/CloudIntegrationPage/Header/Header.tsx # frontend/src/container/CloudIntegrationPage/HeroSection/HeroSection.tsx # frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountActions.style.scss # frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountActions.tsx # frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountSettingsModal.style.scss # frontend/src/container/CloudIntegrationPage/HeroSection/components/AccountSettingsModal.tsx # frontend/src/container/CloudIntegrationPage/HeroSection/components/CloudAccountSetupModal.style.scss # frontend/src/container/CloudIntegrationPage/HeroSection/components/RemoveIntegrationAccount.tsx # frontend/src/container/CloudIntegrationPage/ServicesSection/ConfigureServiceModal.tsx # frontend/src/container/CloudIntegrationPage/ServicesSection/ServicesTabs.style.scss # frontend/src/container/CloudIntegrationPage/ServicesSection/ServicesTabs.tsx # frontend/src/container/DashboardContainer/DashboardSettings/General/AddTags/AddTags.styles.scss # frontend/src/container/DashboardContainer/DashboardSettings/General/GeneralSettings.styles.scss # frontend/src/container/FormAlertRules/ChQuerySection/ChQuerySection.tsx # frontend/src/container/FormAlertRules/UserGuide/index.tsx # frontend/src/container/InfraMonitoringHosts/HostsEmptyOrIncorrectMetrics.tsx # frontend/src/container/InfraMonitoringHosts/InfraMonitoring.styles.scss # frontend/src/container/InfraMonitoringHosts/__tests__/HostsEmptyOrIncorrectMetrics.test.tsx # frontend/src/container/InfraMonitoringK8s/Clusters/ClusterDetails/ClusterDetails.tsx # frontend/src/container/InfraMonitoringK8s/Clusters/utils.tsx # frontend/src/container/InfraMonitoringK8s/DaemonSets/DaemonSetDetails/DaemonSetDetails.tsx # frontend/src/container/InfraMonitoringK8s/DaemonSets/utils.tsx # frontend/src/container/InfraMonitoringK8s/Deployments/DeploymentDetails/DeploymentDetails.tsx # frontend/src/container/InfraMonitoringK8s/Deployments/utils.tsx # frontend/src/container/InfraMonitoringK8s/EntityDetailsUtils/EntityEvents/entityEvents.styles.scss # frontend/src/container/InfraMonitoringK8s/EntityDetailsUtils/EntityTraces/entityTraces.styles.scss # frontend/src/container/InfraMonitoringK8s/InfraMonitoringK8s.styles.scss # frontend/src/container/InfraMonitoringK8s/Jobs/JobDetails/JobDetails.tsx # frontend/src/container/InfraMonitoringK8s/Jobs/utils.tsx # frontend/src/container/InfraMonitoringK8s/K8sEmptyOrIncorrectMetrics.tsx # frontend/src/container/InfraMonitoringK8s/K8sFiltersSidePanel/K8sFiltersSidePanel.styles.scss # frontend/src/container/InfraMonitoringK8s/Namespaces/NamespaceDetails/NamespaceDetails.styles.scss # frontend/src/container/InfraMonitoringK8s/Namespaces/NamespaceDetails/NamespaceDetails.tsx # frontend/src/container/InfraMonitoringK8s/Namespaces/utils.tsx # frontend/src/container/InfraMonitoringK8s/Nodes/NodeDetails/NodeDetails.tsx # frontend/src/container/InfraMonitoringK8s/Nodes/utils.tsx # frontend/src/container/InfraMonitoringK8s/Pods/PodDetails/PodDetails.tsx # frontend/src/container/InfraMonitoringK8s/StatefulSets/StatefulSetDetails/StatefulSetDetails.tsx # frontend/src/container/InfraMonitoringK8s/StatefulSets/utils.tsx # frontend/src/container/InfraMonitoringK8s/Volumes/VolumeDetails/VolumeDetails.tsx # frontend/src/container/InfraMonitoringK8s/Volumes/utils.tsx # frontend/src/container/ListAlertRules/AlertsEmptyState/AlertsEmptyState.styles.scss # frontend/src/container/ListAlertRules/ListAlert.tsx # frontend/src/container/LogsContextList/styles.ts # frontend/src/container/LogsExplorerList/ColumnView/ColumnView.tsx # frontend/src/container/LogsExplorerViews/QueryStatus.tsx # frontend/src/container/MetricsApplication/Tabs/Overview/ApDex/ApDexTraces.tsx # frontend/src/container/MetricsExplorer/Explorer/RelatedMetrics.tsx # frontend/src/container/MetricsExplorer/Explorer/useGetRelatedMetricsGraphs.ts # frontend/src/container/MetricsExplorer/Summary/MetricTypeSearch.tsx # frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/ClickHouse/index.tsx # frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/ClickHouse/query.tsx # frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/index.tsx # frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/query.tsx # frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/datastore/index.tsx # frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/datastore/query.tsx # frontend/src/container/OnboardingQuestionaire/OnboardingFooter/OnboardingFooter.tsx # frontend/src/container/OnboardingQuestionaire/OnboardingHeader/OnboardingHeader.styles.scss # frontend/src/container/OnboardingQuestionaire/OnboardingHeader/OnboardingHeader.tsx # frontend/src/container/OnboardingV2Container/onboarding-configs/onboarding-config-with-links.json # frontend/src/container/QueryBuilder/QueryBuilder.tsx # frontend/src/container/QueryBuilder/components/Query/Query.tsx # frontend/src/container/RolesSettings/__tests__/utils.test.ts # frontend/src/container/ServiceTable/SkipOnBoardModal/index.tsx # frontend/src/container/TraceDetail/Missingtrace.tsx # frontend/src/container/TraceDetail/SelectedSpanDetails/config.ts # frontend/src/lib/uPlotV2/components/Tooltip/Tooltip.styles.scss # frontend/src/mocks-server/__mockdata__/apiKeys.ts # frontend/src/pages/AlertDetails/AlertHeader/AlertStatus/AlertStatus.tsx # frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailPage.styles.scss # frontend/src/pages/Integrations/IntegrationDetailPage/IntegrationDetailPage.tsx # frontend/src/pages/Integrations/IntegrationsList.tsx # frontend/src/pages/Integrations/utils.ts # frontend/src/types/api/integrations/aws.ts # pkg/alertmanager/o11yalertmanager/handler.go # pkg/apiserver/o11yapiserver/alertmanager.go # pkg/apiserver/o11yapiserver/cloudintegration.go # pkg/apiserver/o11yapiserver/inframonitoring.go # pkg/apiserver/o11yapiserver/llmpricingrule.go # pkg/apiserver/o11yapiserver/rawdataexport.go # pkg/apiserver/o11yapiserver/registry.go # pkg/apiserver/o11yapiserver/ruler.go # pkg/apiserver/o11yapiserver/ruler_examples.go # pkg/apiserver/o11yapiserver/ruler_examples_test.go # pkg/apiserver/o11yapiserver/rulestatehistory.go # pkg/apiserver/o11yapiserver/spanmapper.go # pkg/apiserver/o11yapiserver/tracedetail.go # pkg/authn/callbackauthn/googlecallbackauthn/authn.go # pkg/authz/openfgaauthz/provider.go # pkg/authz/openfgaschema/base.fga # pkg/authz/openfgaserver/server.go # pkg/authz/openfgaserver/server_test.go # pkg/authz/openfgaserver/sqlstore.go # pkg/http/middleware/api_key.go # pkg/http/middleware/authn.go # pkg/instrumentation/metric.go # pkg/modules/user/impluser/module.go # pkg/prometheus/clickhouseprometheus/client.go # pkg/prometheus/clickhouseprometheus/client_query_test.go # pkg/prometheus/clickhouseprometheus/provider.go # pkg/prometheus/config.go # pkg/prometheus/engine.go # pkg/prometheus/label.go # pkg/prometheus/prometheus.go # pkg/prometheus/prometheustest/provider.go # pkg/prometheus/prometheustest/utils_test.go # pkg/querier/promql_query.go # pkg/query-service/app/cloudintegrations/Readme.md # pkg/query-service/app/cloudintegrations/accountsRepo.go # pkg/query-service/app/cloudintegrations/constants.go # pkg/query-service/app/cloudintegrations/controller.go # pkg/query-service/app/cloudintegrations/models.go # pkg/query-service/app/cloudintegrations/serviceconfig_db.go # pkg/query-service/app/cloudintegrations/services/definitions/aws/eks/assets/dashboards/containerinsights.json # pkg/query-service/app/cloudintegrations/services/definitions/aws/eks/assets/dashboards/containerinsights_dot.json # pkg/query-service/app/cloudintegrations/services/definitions/aws/eks/assets/dashboards/overview.json # pkg/query-service/app/cloudintegrations/services/definitions/aws/eks/assets/dashboards/overview_dot.json # pkg/query-service/app/cloudintegrations/services/models.go # pkg/query-service/app/cloudintegrations/services/services.go # pkg/query-service/app/cloudintegrations/services/services_test.go # pkg/query-service/app/integrations/builtin_integrations/clickhouse/assets/dashboards/overview_dot.json # pkg/query-service/app/integrations/builtin_integrations/datastore/assets/dashboards/overview_dot.json # pkg/query-service/app/metricsexplorer/parser.go # pkg/query-service/app/metricsexplorer/summary.go # pkg/query-service/app/querier/querier_test.go # pkg/query-service/app/querier/v2/querier_test.go # pkg/query-service/app/summary.go # pkg/query-service/model/metrics_explorer/summary.go # pkg/query-service/rules/base_rule_test.go # pkg/query-service/rules/manager_test.go # pkg/query-service/rules/prom_rule.go # pkg/query-service/rules/prom_rule_task.go # pkg/query-service/rules/prom_rule_test.go # pkg/query-service/rules/threshold_rule_test.go # pkg/querybuilder/resourcefilter/tables.go # pkg/queryparser/queryfilterextractor/promql.go # pkg/ruler/o11yruler/handler.go # pkg/sqlmigration/088_migrate_ii_dashboards/clickhouse/overview.json # pkg/telemetrymetadata/metadata_test.go # pkg/telemetrystore/datastoretelemetrystore/telemetry.go # pkg/types/authtypes/name.go # pkg/types/authtypes/object.go # pkg/types/authtypes/selector.go # pkg/types/authtypes/typeable.go # pkg/types/authtypes/typeable_anonymous.go # pkg/types/authtypes/typeable_metaresource.go # pkg/types/authtypes/typeable_metaresources.go # pkg/types/authtypes/typeable_organization.go # pkg/types/authtypes/typeable_role.go # pkg/types/authtypes/typeable_user.go # pkg/types/authtypes/uuid.go # pkg/types/ctxtypes/auth.go # pkg/types/factor_api_key.go # pkg/types/integrationtypes/integration.go # pkg/types/roletypes/store.go # pkg/types/ruletypes/maintenance.go # pkg/types/serviceaccounttypes/service_account_role.go # pkg/types/serviceaccounttypes/store.go
331 lines
9.1 KiB
Go
331 lines
9.1 KiB
Go
package contextlinks
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/url"
|
|
"strconv"
|
|
"time"
|
|
|
|
tracesV3 "github.com/hanzoai/o11y/pkg/query-service/app/traces/v3"
|
|
v3 "github.com/hanzoai/o11y/pkg/query-service/model/v3"
|
|
"github.com/hanzoai/o11y/pkg/query-service/utils"
|
|
)
|
|
|
|
func PrepareLinksToTraces(start, end time.Time, filterItems []v3.FilterItem) string {
|
|
|
|
// Traces list view expects time in nanoseconds
|
|
tr := URLShareableTimeRange{
|
|
Start: start.UnixNano(),
|
|
End: end.UnixNano(),
|
|
PageSize: 100,
|
|
}
|
|
|
|
options := URLShareableOptions{
|
|
MaxLines: 2,
|
|
Format: "list",
|
|
SelectColumns: tracesV3.TracesListViewDefaultSelectedColumns,
|
|
}
|
|
|
|
period, _ := json.Marshal(tr)
|
|
urlEncodedTimeRange := url.QueryEscape(string(period))
|
|
|
|
builderQuery := v3.BuilderQuery{
|
|
DataSource: v3.DataSourceTraces,
|
|
QueryName: "A",
|
|
AggregateOperator: v3.AggregateOperatorNoOp,
|
|
AggregateAttribute: v3.AttributeKey{},
|
|
Filters: &v3.FilterSet{
|
|
Items: filterItems,
|
|
Operator: "AND",
|
|
},
|
|
Expression: "A",
|
|
Disabled: false,
|
|
Having: []v3.Having{},
|
|
StepInterval: 60,
|
|
OrderBy: []v3.OrderBy{
|
|
{
|
|
ColumnName: "timestamp",
|
|
Order: "desc",
|
|
},
|
|
},
|
|
}
|
|
|
|
urlData := URLShareableCompositeQuery{
|
|
QueryType: string(v3.QueryTypeBuilder),
|
|
Builder: URLShareableBuilderQuery{
|
|
QueryData: []LinkQuery{
|
|
{BuilderQuery: builderQuery},
|
|
},
|
|
QueryFormulas: make([]string, 0),
|
|
},
|
|
}
|
|
|
|
data, _ := json.Marshal(urlData)
|
|
compositeQuery := url.QueryEscape(url.QueryEscape(string(data)))
|
|
|
|
optionsData, _ := json.Marshal(options)
|
|
urlEncodedOptions := url.QueryEscape(string(optionsData))
|
|
|
|
return fmt.Sprintf("compositeQuery=%s&timeRange=%s&startTime=%d&endTime=%d&options=%s", compositeQuery, urlEncodedTimeRange, tr.Start, tr.End, urlEncodedOptions)
|
|
}
|
|
|
|
func PrepareLinksToLogs(start, end time.Time, filterItems []v3.FilterItem) string {
|
|
|
|
// Logs list view expects time in milliseconds
|
|
tr := URLShareableTimeRange{
|
|
Start: start.UnixMilli(),
|
|
End: end.UnixMilli(),
|
|
PageSize: 100,
|
|
}
|
|
|
|
options := URLShareableOptions{
|
|
MaxLines: 2,
|
|
Format: "list",
|
|
SelectColumns: []v3.AttributeKey{},
|
|
}
|
|
|
|
period, _ := json.Marshal(tr)
|
|
urlEncodedTimeRange := url.QueryEscape(string(period))
|
|
|
|
builderQuery := v3.BuilderQuery{
|
|
DataSource: v3.DataSourceLogs,
|
|
QueryName: "A",
|
|
AggregateOperator: v3.AggregateOperatorNoOp,
|
|
AggregateAttribute: v3.AttributeKey{},
|
|
Filters: &v3.FilterSet{
|
|
Items: filterItems,
|
|
Operator: "AND",
|
|
},
|
|
Expression: "A",
|
|
Disabled: false,
|
|
Having: []v3.Having{},
|
|
StepInterval: 60,
|
|
OrderBy: []v3.OrderBy{
|
|
{
|
|
ColumnName: "timestamp",
|
|
Order: "desc",
|
|
},
|
|
},
|
|
}
|
|
|
|
urlData := URLShareableCompositeQuery{
|
|
QueryType: string(v3.QueryTypeBuilder),
|
|
Builder: URLShareableBuilderQuery{
|
|
QueryData: []LinkQuery{
|
|
{BuilderQuery: builderQuery},
|
|
},
|
|
QueryFormulas: make([]string, 0),
|
|
},
|
|
}
|
|
|
|
data, _ := json.Marshal(urlData)
|
|
compositeQuery := url.QueryEscape(url.QueryEscape(string(data)))
|
|
|
|
optionsData, _ := json.Marshal(options)
|
|
urlEncodedOptions := url.QueryEscape(string(optionsData))
|
|
|
|
return fmt.Sprintf("compositeQuery=%s&timeRange=%s&startTime=%d&endTime=%d&options=%s", compositeQuery, urlEncodedTimeRange, tr.Start, tr.End, urlEncodedOptions)
|
|
}
|
|
|
|
// The following function is used to prepare the where clause for the query
|
|
// `lbls` contains the key value pairs of the labels from the result of the query
|
|
// We iterate over the where clause and replace the labels with the actual values
|
|
// There are two cases:
|
|
// 1. The label is present in the where clause
|
|
// 2. The label is not present in the where clause
|
|
//
|
|
// Example for case 2:
|
|
// Latency by serviceName without any filter
|
|
// In this case, for each service with latency > threshold we send a notification
|
|
// The expectation will be that clicking on the related traces for service A, will
|
|
// take us to the traces page with the filter serviceName=A
|
|
// So for all the missing labels in the where clause, we add them as key = value
|
|
//
|
|
// Example for case 1:
|
|
// Severity text IN (WARN, ERROR)
|
|
// In this case, the Severity text will appear in the `lbls` if it were part of the group
|
|
// by clause, in which case we replace it with the actual value for the notification
|
|
// i.e Severity text = WARN
|
|
// If the Severity text is not part of the group by clause, then we add it as it is.
|
|
func PrepareFilters(labels map[string]string, whereClauseItems []v3.FilterItem, groupByItems []v3.AttributeKey, keys map[string]v3.AttributeKey) []v3.FilterItem {
|
|
filterItems := make([]v3.FilterItem, 0)
|
|
|
|
//delete predefined alert labels
|
|
for _, label := range PredefinedAlertLabels {
|
|
delete(labels, label)
|
|
}
|
|
|
|
added := make(map[string]struct{})
|
|
|
|
for _, item := range whereClauseItems {
|
|
exists := false
|
|
for key, value := range labels {
|
|
if item.Key.Key == key {
|
|
// if the label is present in the where clause, replace it with key = value
|
|
filterItems = append(filterItems, v3.FilterItem{
|
|
Key: item.Key,
|
|
Operator: v3.FilterOperatorEqual,
|
|
Value: value,
|
|
})
|
|
exists = true
|
|
added[key] = struct{}{}
|
|
break
|
|
}
|
|
}
|
|
|
|
if !exists {
|
|
// if there is no label for the filter item, add it as it is
|
|
filterItems = append(filterItems, item)
|
|
}
|
|
}
|
|
|
|
// if there are labels which are not part of the where clause, but
|
|
// exist in the result, then they could be part of the group by clause
|
|
for key, value := range labels {
|
|
if _, ok := added[key]; !ok {
|
|
// start by taking the attribute key from the keys map, if not present, create a new one
|
|
var attributeKey v3.AttributeKey
|
|
var attrFound bool
|
|
|
|
// as of now this logic will only apply for logs
|
|
for _, tKey := range utils.GenerateEnrichmentKeys(v3.AttributeKey{Key: key}) {
|
|
if val, ok := keys[tKey]; ok {
|
|
attributeKey = val
|
|
attrFound = true
|
|
break
|
|
}
|
|
}
|
|
|
|
// check if the attribute key is directly present, as of now this will always be false for logs
|
|
// as for logs it will be satisfied in the condition above
|
|
if !attrFound {
|
|
attributeKey, attrFound = keys[key]
|
|
}
|
|
|
|
// if the attribute key is not present, create a new one
|
|
if !attrFound {
|
|
attributeKey = v3.AttributeKey{Key: key}
|
|
}
|
|
|
|
// if there is a group by item with the same key, use that instead
|
|
for _, groupByItem := range groupByItems {
|
|
if groupByItem.Key == key {
|
|
attributeKey = groupByItem
|
|
break
|
|
}
|
|
}
|
|
|
|
filterItems = append(filterItems, v3.FilterItem{
|
|
Key: attributeKey,
|
|
Operator: v3.FilterOperatorEqual,
|
|
Value: value,
|
|
})
|
|
}
|
|
}
|
|
|
|
return filterItems
|
|
}
|
|
|
|
func PrepareParamsForTracesV5(start, end time.Time, whereClause string) url.Values {
|
|
|
|
// Traces list view expects time in nanoseconds
|
|
tr := URLShareableTimeRange{
|
|
Start: start.UnixNano(),
|
|
End: end.UnixNano(),
|
|
PageSize: 100,
|
|
}
|
|
|
|
options := URLShareableOptions{}
|
|
|
|
period, _ := json.Marshal(tr)
|
|
|
|
linkQuery := LinkQuery{
|
|
BuilderQuery: v3.BuilderQuery{
|
|
DataSource: v3.DataSourceTraces,
|
|
QueryName: "A",
|
|
AggregateOperator: v3.AggregateOperatorNoOp,
|
|
AggregateAttribute: v3.AttributeKey{},
|
|
Expression: "A",
|
|
Disabled: false,
|
|
Having: []v3.Having{},
|
|
StepInterval: 60,
|
|
},
|
|
Filter: &FilterExpression{Expression: whereClause},
|
|
}
|
|
|
|
urlData := URLShareableCompositeQuery{
|
|
QueryType: string(v3.QueryTypeBuilder),
|
|
Builder: URLShareableBuilderQuery{
|
|
QueryData: []LinkQuery{
|
|
linkQuery,
|
|
},
|
|
QueryFormulas: make([]string, 0),
|
|
},
|
|
}
|
|
|
|
data, _ := json.Marshal(urlData)
|
|
compositeQuery := url.QueryEscape(string(data))
|
|
|
|
optionsData, _ := json.Marshal(options)
|
|
|
|
params := url.Values{}
|
|
params.Set("compositeQuery", compositeQuery)
|
|
params.Set("timeRange", string(period))
|
|
params.Set("startTime", strconv.FormatInt(tr.Start, 10))
|
|
params.Set("endTime", strconv.FormatInt(tr.End, 10))
|
|
params.Set("options", string(optionsData))
|
|
return params
|
|
}
|
|
|
|
func PrepareParamsForLogsV5(start, end time.Time, whereClause string) url.Values {
|
|
|
|
// Logs list view expects time in milliseconds
|
|
tr := URLShareableTimeRange{
|
|
Start: start.UnixMilli(),
|
|
End: end.UnixMilli(),
|
|
PageSize: 100,
|
|
}
|
|
|
|
options := URLShareableOptions{}
|
|
|
|
period, _ := json.Marshal(tr)
|
|
|
|
linkQuery := LinkQuery{
|
|
BuilderQuery: v3.BuilderQuery{
|
|
DataSource: v3.DataSourceLogs,
|
|
QueryName: "A",
|
|
AggregateOperator: v3.AggregateOperatorNoOp,
|
|
AggregateAttribute: v3.AttributeKey{},
|
|
Expression: "A",
|
|
Disabled: false,
|
|
Having: []v3.Having{},
|
|
StepInterval: 60,
|
|
},
|
|
Filter: &FilterExpression{Expression: whereClause},
|
|
}
|
|
|
|
urlData := URLShareableCompositeQuery{
|
|
QueryType: string(v3.QueryTypeBuilder),
|
|
Builder: URLShareableBuilderQuery{
|
|
QueryData: []LinkQuery{
|
|
linkQuery,
|
|
},
|
|
QueryFormulas: make([]string, 0),
|
|
},
|
|
}
|
|
|
|
data, _ := json.Marshal(urlData)
|
|
compositeQuery := url.QueryEscape(string(data))
|
|
|
|
optionsData, _ := json.Marshal(options)
|
|
|
|
params := url.Values{}
|
|
params.Set("compositeQuery", compositeQuery)
|
|
params.Set("timeRange", string(period))
|
|
params.Set("startTime", strconv.FormatInt(tr.Start, 10))
|
|
params.Set("endTime", strconv.FormatInt(tr.End, 10))
|
|
params.Set("options", string(optionsData))
|
|
return params
|
|
}
|