Merge branch 'main' into field-map-condition-builder

This commit is contained in:
srikanthccv 2025-05-30 21:17:18 +05:30
commit e07f3bdfce
130 changed files with 17257 additions and 14670 deletions

View File

@ -3,6 +3,7 @@ package httplicensing
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"github.com/SigNoz/signoz/ee/query-service/constants"
"time" "time"
"github.com/SigNoz/signoz/ee/licensing/licensingstore/sqllicensingstore" "github.com/SigNoz/signoz/ee/licensing/licensingstore/sqllicensingstore"
@ -251,6 +252,13 @@ func (provider *provider) GetFeatureFlags(ctx context.Context) ([]*featuretypes.
} }
} }
if constants.IsDotMetricsEnabled {
gettableFeatures = append(gettableFeatures, &featuretypes.GettableFeature{
Name: featuretypes.DotMetricsEnabled,
Active: true,
})
}
return gettableFeatures, nil return gettableFeatures, nil
} }

View File

@ -4,6 +4,10 @@ import (
"os" "os"
) )
const (
DefaultSiteURL = "https://localhost:8080"
)
var LicenseSignozIo = "https://license.signoz.io/api/v1" var LicenseSignozIo = "https://license.signoz.io/api/v1"
var LicenseAPIKey = GetOrDefaultEnv("SIGNOZ_LICENSE_API_KEY", "") var LicenseAPIKey = GetOrDefaultEnv("SIGNOZ_LICENSE_API_KEY", "")
var SaasSegmentKey = GetOrDefaultEnv("SIGNOZ_SAAS_SEGMENT_KEY", "") var SaasSegmentKey = GetOrDefaultEnv("SIGNOZ_SAAS_SEGMENT_KEY", "")
@ -20,3 +24,22 @@ func GetOrDefaultEnv(key string, fallback string) string {
} }
return v return v
} }
// constant functions that override env vars
// GetDefaultSiteURL returns default site url, primarily
// used to send saml request and allowing backend to
// handle http redirect
func GetDefaultSiteURL() string {
return GetOrDefaultEnv("SIGNOZ_SITE_URL", DefaultSiteURL)
}
const DotMetricsEnabled = "DOT_METRICS_ENABLED"
var IsDotMetricsEnabled = false
func init() {
if GetOrDefaultEnv(DotMetricsEnabled, "false") == "true" {
IsDotMetricsEnabled = true
}
}

View File

@ -5,6 +5,8 @@ import { ErrorResponse, SuccessResponse } from 'types/api';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { TagFilter } from 'types/api/queryBuilder/queryBuilderData'; import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
import { UnderscoreToDotMap } from '../utils';
export interface K8sClustersListPayload { export interface K8sClustersListPayload {
filters: TagFilter; filters: TagFilter;
groupBy?: BaseAutocompleteData[]; groupBy?: BaseAutocompleteData[];
@ -40,23 +42,80 @@ export interface K8sClustersListResponse {
}; };
} }
export const clustersMetaMap = [
{ dot: 'k8s.cluster.name', under: 'k8s_cluster_name' },
{ dot: 'k8s.cluster.uid', under: 'k8s_cluster_uid' },
] as const;
export function mapClustersMeta(
raw: Record<string, unknown>,
): K8sClustersData['meta'] {
const out: Record<string, unknown> = { ...raw };
clustersMetaMap.forEach(({ dot, under }) => {
if (dot in raw) {
const v = raw[dot];
out[under] = typeof v === 'string' ? v : raw[under];
}
});
return out as K8sClustersData['meta'];
}
export const getK8sClustersList = async ( export const getK8sClustersList = async (
props: K8sClustersListPayload, props: K8sClustersListPayload,
signal?: AbortSignal, signal?: AbortSignal,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled = false,
): Promise<SuccessResponse<K8sClustersListResponse> | ErrorResponse> => { ): Promise<SuccessResponse<K8sClustersListResponse> | ErrorResponse> => {
try { try {
const response = await axios.post('/clusters/list', props, { const requestProps =
dotMetricsEnabled && Array.isArray(props.filters?.items)
? {
...props,
filters: {
...props.filters,
items: props.filters.items.reduce<typeof props.filters.items>(
(acc, item) => {
if (item.value === undefined) return acc;
if (
item.key &&
typeof item.key === 'object' &&
'key' in item.key &&
typeof item.key.key === 'string'
) {
const mappedKey = UnderscoreToDotMap[item.key.key] ?? item.key.key;
acc.push({
...item,
key: { ...item.key, key: mappedKey },
});
} else {
acc.push(item);
}
return acc;
},
[] as typeof props.filters.items,
),
},
}
: props;
const response = await axios.post('/clusters/list', requestProps, {
signal, signal,
headers, headers,
}); });
const payload: K8sClustersListResponse = response.data;
// one-liner meta mapping
payload.data.records = payload.data.records.map((record) => ({
...record,
meta: mapClustersMeta(record.meta as Record<string, unknown>),
}));
return { return {
statusCode: 200, statusCode: 200,
error: null, error: null,
message: 'Success', message: 'Success',
payload: response.data, payload,
params: props, params: requestProps,
}; };
} catch (error) { } catch (error) {
return ErrorResponseHandler(error as AxiosError); return ErrorResponseHandler(error as AxiosError);

View File

@ -5,6 +5,8 @@ import { ErrorResponse, SuccessResponse } from 'types/api';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { TagFilter } from 'types/api/queryBuilder/queryBuilderData'; import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
import { UnderscoreToDotMap } from '../utils';
export interface K8sDaemonSetsListPayload { export interface K8sDaemonSetsListPayload {
filters: TagFilter; filters: TagFilter;
groupBy?: BaseAutocompleteData[]; groupBy?: BaseAutocompleteData[];
@ -46,23 +48,82 @@ export interface K8sDaemonSetsListResponse {
}; };
} }
export const daemonSetsMetaMap = [
{ dot: 'k8s.namespace.name', under: 'k8s_namespace_name' },
{ dot: 'k8s.daemonset.name', under: 'k8s_daemonset_name' },
{ dot: 'k8s.cluster.name', under: 'k8s_cluster_name' },
] as const;
export function mapDaemonSetsMeta(
raw: Record<string, unknown>,
): K8sDaemonSetsData['meta'] {
const out: Record<string, unknown> = { ...raw };
daemonSetsMetaMap.forEach(({ dot, under }) => {
if (dot in raw) {
const v = raw[dot];
out[under] = typeof v === 'string' ? v : raw[under];
}
});
return out as K8sDaemonSetsData['meta'];
}
export const getK8sDaemonSetsList = async ( export const getK8sDaemonSetsList = async (
props: K8sDaemonSetsListPayload, props: K8sDaemonSetsListPayload,
signal?: AbortSignal, signal?: AbortSignal,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled = false,
): Promise<SuccessResponse<K8sDaemonSetsListResponse> | ErrorResponse> => { ): Promise<SuccessResponse<K8sDaemonSetsListResponse> | ErrorResponse> => {
try { try {
const response = await axios.post('/daemonsets/list', props, { // filter prep (unchanged)…
const requestProps =
dotMetricsEnabled && Array.isArray(props.filters?.items)
? {
...props,
filters: {
...props.filters,
items: props.filters.items.reduce<typeof props.filters.items>(
(acc, item) => {
if (item.value === undefined) return acc;
if (
item.key &&
typeof item.key === 'object' &&
'key' in item.key &&
typeof item.key.key === 'string'
) {
const mappedKey = UnderscoreToDotMap[item.key.key] ?? item.key.key;
acc.push({
...item,
key: { ...item.key, key: mappedKey },
});
} else {
acc.push(item);
}
return acc;
},
[] as typeof props.filters.items,
),
},
}
: props;
const response = await axios.post('/daemonsets/list', requestProps, {
signal, signal,
headers, headers,
}); });
const payload: K8sDaemonSetsListResponse = response.data;
// single-line meta mapping
payload.data.records = payload.data.records.map((record) => ({
...record,
meta: mapDaemonSetsMeta(record.meta as Record<string, unknown>),
}));
return { return {
statusCode: 200, statusCode: 200,
error: null, error: null,
message: 'Success', message: 'Success',
payload: response.data, payload,
params: props, params: requestProps,
}; };
} catch (error) { } catch (error) {
return ErrorResponseHandler(error as AxiosError); return ErrorResponseHandler(error as AxiosError);

View File

@ -5,6 +5,8 @@ import { ErrorResponse, SuccessResponse } from 'types/api';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { TagFilter } from 'types/api/queryBuilder/queryBuilderData'; import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
import { UnderscoreToDotMap } from '../utils';
export interface K8sDeploymentsListPayload { export interface K8sDeploymentsListPayload {
filters: TagFilter; filters: TagFilter;
groupBy?: BaseAutocompleteData[]; groupBy?: BaseAutocompleteData[];
@ -46,23 +48,81 @@ export interface K8sDeploymentsListResponse {
}; };
} }
export const deploymentsMetaMap = [
{ dot: 'k8s.cluster.name', under: 'k8s_cluster_name' },
{ dot: 'k8s.deployment.name', under: 'k8s_deployment_name' },
{ dot: 'k8s.namespace.name', under: 'k8s_namespace_name' },
] as const;
export function mapDeploymentsMeta(
raw: Record<string, unknown>,
): K8sDeploymentsData['meta'] {
const out: Record<string, unknown> = { ...raw };
deploymentsMetaMap.forEach(({ dot, under }) => {
if (dot in raw) {
const v = raw[dot];
out[under] = typeof v === 'string' ? v : raw[under];
}
});
return out as K8sDeploymentsData['meta'];
}
export const getK8sDeploymentsList = async ( export const getK8sDeploymentsList = async (
props: K8sDeploymentsListPayload, props: K8sDeploymentsListPayload,
signal?: AbortSignal, signal?: AbortSignal,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled = false,
): Promise<SuccessResponse<K8sDeploymentsListResponse> | ErrorResponse> => { ): Promise<SuccessResponse<K8sDeploymentsListResponse> | ErrorResponse> => {
try { try {
const response = await axios.post('/deployments/list', props, { const requestProps =
dotMetricsEnabled && Array.isArray(props.filters?.items)
? {
...props,
filters: {
...props.filters,
items: props.filters.items.reduce<typeof props.filters.items>(
(acc, item) => {
if (item.value === undefined) return acc;
if (
item.key &&
typeof item.key === 'object' &&
'key' in item.key &&
typeof item.key.key === 'string'
) {
const mappedKey = UnderscoreToDotMap[item.key.key] ?? item.key.key;
acc.push({
...item,
key: { ...item.key, key: mappedKey },
});
} else {
acc.push(item);
}
return acc;
},
[] as typeof props.filters.items,
),
},
}
: props;
const response = await axios.post('/deployments/list', requestProps, {
signal, signal,
headers, headers,
}); });
const payload: K8sDeploymentsListResponse = response.data;
// single-line mapping
payload.data.records = payload.data.records.map((record) => ({
...record,
meta: mapDeploymentsMeta(record.meta as Record<string, unknown>),
}));
return { return {
statusCode: 200, statusCode: 200,
error: null, error: null,
message: 'Success', message: 'Success',
payload: response.data, payload,
params: props, params: requestProps,
}; };
} catch (error) { } catch (error) {
return ErrorResponseHandler(error as AxiosError); return ErrorResponseHandler(error as AxiosError);

View File

@ -5,6 +5,8 @@ import { ErrorResponse, SuccessResponse } from 'types/api';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { TagFilter } from 'types/api/queryBuilder/queryBuilderData'; import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
import { UnderscoreToDotMap } from '../utils';
export interface K8sJobsListPayload { export interface K8sJobsListPayload {
filters: TagFilter; filters: TagFilter;
groupBy?: BaseAutocompleteData[]; groupBy?: BaseAutocompleteData[];
@ -48,23 +50,79 @@ export interface K8sJobsListResponse {
}; };
} }
export const jobsMetaMap = [
{ dot: 'k8s.cluster.name', under: 'k8s_cluster_name' },
{ dot: 'k8s.job.name', under: 'k8s_job_name' },
{ dot: 'k8s.namespace.name', under: 'k8s_namespace_name' },
] as const;
export function mapJobsMeta(raw: Record<string, unknown>): K8sJobsData['meta'] {
const out: Record<string, unknown> = { ...raw };
jobsMetaMap.forEach(({ dot, under }) => {
if (dot in raw) {
const v = raw[dot];
out[under] = typeof v === 'string' ? v : raw[under];
}
});
return out as K8sJobsData['meta'];
}
export const getK8sJobsList = async ( export const getK8sJobsList = async (
props: K8sJobsListPayload, props: K8sJobsListPayload,
signal?: AbortSignal, signal?: AbortSignal,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled = false,
): Promise<SuccessResponse<K8sJobsListResponse> | ErrorResponse> => { ): Promise<SuccessResponse<K8sJobsListResponse> | ErrorResponse> => {
try { try {
const response = await axios.post('/jobs/list', props, { const requestProps =
dotMetricsEnabled && Array.isArray(props.filters?.items)
? {
...props,
filters: {
...props.filters,
items: props.filters.items.reduce<typeof props.filters.items>(
(acc, item) => {
if (item.value === undefined) return acc;
if (
item.key &&
typeof item.key === 'object' &&
'key' in item.key &&
typeof item.key.key === 'string'
) {
const mappedKey = UnderscoreToDotMap[item.key.key] ?? item.key.key;
acc.push({
...item,
key: { ...item.key, key: mappedKey },
});
} else {
acc.push(item);
}
return acc;
},
[] as typeof props.filters.items,
),
},
}
: props;
const response = await axios.post('/jobs/list', requestProps, {
signal, signal,
headers, headers,
}); });
const payload: K8sJobsListResponse = response.data;
// one-liner meta mapping
payload.data.records = payload.data.records.map((record) => ({
...record,
meta: mapJobsMeta(record.meta as Record<string, unknown>),
}));
return { return {
statusCode: 200, statusCode: 200,
error: null, error: null,
message: 'Success', message: 'Success',
payload: response.data, payload,
params: props, params: requestProps,
}; };
} catch (error) { } catch (error) {
return ErrorResponseHandler(error as AxiosError); return ErrorResponseHandler(error as AxiosError);

View File

@ -5,6 +5,8 @@ import { ErrorResponse, SuccessResponse } from 'types/api';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { TagFilter } from 'types/api/queryBuilder/queryBuilderData'; import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
import { UnderscoreToDotMap } from '../utils';
export interface K8sNamespacesListPayload { export interface K8sNamespacesListPayload {
filters: TagFilter; filters: TagFilter;
groupBy?: BaseAutocompleteData[]; groupBy?: BaseAutocompleteData[];
@ -38,23 +40,79 @@ export interface K8sNamespacesListResponse {
}; };
} }
export const namespacesMetaMap = [
{ dot: 'k8s.cluster.name', under: 'k8s_cluster_name' },
{ dot: 'k8s.namespace.name', under: 'k8s_namespace_name' },
] as const;
export function mapNamespacesMeta(
raw: Record<string, unknown>,
): K8sNamespacesData['meta'] {
const out: Record<string, unknown> = { ...raw };
namespacesMetaMap.forEach(({ dot, under }) => {
if (dot in raw) {
const v = raw[dot];
out[under] = typeof v === 'string' ? v : raw[under];
}
});
return out as K8sNamespacesData['meta'];
}
export const getK8sNamespacesList = async ( export const getK8sNamespacesList = async (
props: K8sNamespacesListPayload, props: K8sNamespacesListPayload,
signal?: AbortSignal, signal?: AbortSignal,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled = false,
): Promise<SuccessResponse<K8sNamespacesListResponse> | ErrorResponse> => { ): Promise<SuccessResponse<K8sNamespacesListResponse> | ErrorResponse> => {
try { try {
const response = await axios.post('/namespaces/list', props, { const requestProps =
dotMetricsEnabled && Array.isArray(props.filters?.items)
? {
...props,
filters: {
...props.filters,
items: props.filters.items.reduce<typeof props.filters.items>(
(acc, item) => {
if (item.value === undefined) return acc;
if (
item.key &&
typeof item.key === 'object' &&
'key' in item.key &&
typeof item.key.key === 'string'
) {
const mappedKey = UnderscoreToDotMap[item.key.key] ?? item.key.key;
acc.push({
...item,
key: { ...item.key, key: mappedKey },
});
} else {
acc.push(item);
}
return acc;
},
[] as typeof props.filters.items,
),
},
}
: props;
const response = await axios.post('/namespaces/list', requestProps, {
signal, signal,
headers, headers,
}); });
const payload: K8sNamespacesListResponse = response.data;
payload.data.records = payload.data.records.map((record) => ({
...record,
meta: mapNamespacesMeta(record.meta as Record<string, unknown>),
}));
return { return {
statusCode: 200, statusCode: 200,
error: null, error: null,
message: 'Success', message: 'Success',
payload: response.data, payload,
params: props, params: requestProps,
}; };
} catch (error) { } catch (error) {
return ErrorResponseHandler(error as AxiosError); return ErrorResponseHandler(error as AxiosError);

View File

@ -5,6 +5,8 @@ import { ErrorResponse, SuccessResponse } from 'types/api';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { TagFilter } from 'types/api/queryBuilder/queryBuilderData'; import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
import { UnderscoreToDotMap } from '../utils';
export interface K8sNodesListPayload { export interface K8sNodesListPayload {
filters: TagFilter; filters: TagFilter;
groupBy?: BaseAutocompleteData[]; groupBy?: BaseAutocompleteData[];
@ -41,23 +43,81 @@ export interface K8sNodesListResponse {
}; };
} }
export const nodesMetaMap = [
{ dot: 'k8s.node.name', under: 'k8s_node_name' },
{ dot: 'k8s.node.uid', under: 'k8s_node_uid' },
{ dot: 'k8s.cluster.name', under: 'k8s_cluster_name' },
] as const;
export function mapNodesMeta(
raw: Record<string, unknown>,
): K8sNodesData['meta'] {
const out: Record<string, unknown> = { ...raw };
nodesMetaMap.forEach(({ dot, under }) => {
if (dot in raw) {
const v = raw[dot];
out[under] = typeof v === 'string' ? v : raw[under];
}
});
return out as K8sNodesData['meta'];
}
export const getK8sNodesList = async ( export const getK8sNodesList = async (
props: K8sNodesListPayload, props: K8sNodesListPayload,
signal?: AbortSignal, signal?: AbortSignal,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled = false,
): Promise<SuccessResponse<K8sNodesListResponse> | ErrorResponse> => { ): Promise<SuccessResponse<K8sNodesListResponse> | ErrorResponse> => {
try { try {
const response = await axios.post('/nodes/list', props, { const requestProps =
dotMetricsEnabled && Array.isArray(props.filters?.items)
? {
...props,
filters: {
...props.filters,
items: props.filters.items.reduce<typeof props.filters.items>(
(acc, item) => {
if (item.value === undefined) return acc;
if (
item.key &&
typeof item.key === 'object' &&
'key' in item.key &&
typeof item.key.key === 'string'
) {
const mappedKey = UnderscoreToDotMap[item.key.key] ?? item.key.key;
acc.push({
...item,
key: { ...item.key, key: mappedKey },
});
} else {
acc.push(item);
}
return acc;
},
[] as typeof props.filters.items,
),
},
}
: props;
const response = await axios.post('/nodes/list', requestProps, {
signal, signal,
headers, headers,
}); });
const payload: K8sNodesListResponse = response.data;
// one-liner to map dot→underscore
payload.data.records = payload.data.records.map((record) => ({
...record,
meta: mapNodesMeta(record.meta as Record<string, unknown>),
}));
return { return {
statusCode: 200, statusCode: 200,
error: null, error: null,
message: 'Success', message: 'Success',
payload: response.data, payload,
params: props, params: requestProps,
}; };
} catch (error) { } catch (error) {
return ErrorResponseHandler(error as AxiosError); return ErrorResponseHandler(error as AxiosError);

View File

@ -5,6 +5,8 @@ import { ErrorResponse, SuccessResponse } from 'types/api';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { TagFilter } from 'types/api/queryBuilder/queryBuilderData'; import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
import { UnderscoreToDotMap } from '../utils';
export interface K8sPodsListPayload { export interface K8sPodsListPayload {
filters: TagFilter; filters: TagFilter;
groupBy?: BaseAutocompleteData[]; groupBy?: BaseAutocompleteData[];
@ -69,23 +71,87 @@ export interface K8sPodsListResponse {
}; };
} }
export const podsMetaMap = [
{ dot: 'k8s.cronjob.name', under: 'k8s_cronjob_name' },
{ dot: 'k8s.daemonset.name', under: 'k8s_daemonset_name' },
{ dot: 'k8s.deployment.name', under: 'k8s_deployment_name' },
{ dot: 'k8s.job.name', under: 'k8s_job_name' },
{ dot: 'k8s.namespace.name', under: 'k8s_namespace_name' },
{ dot: 'k8s.node.name', under: 'k8s_node_name' },
{ dot: 'k8s.pod.name', under: 'k8s_pod_name' },
{ dot: 'k8s.pod.uid', under: 'k8s_pod_uid' },
{ dot: 'k8s.statefulset.name', under: 'k8s_statefulset_name' },
{ dot: 'k8s.cluster.name', under: 'k8s_cluster_name' },
] as const;
export function mapPodsMeta(raw: Record<string, unknown>): K8sPodsData['meta'] {
// clone everything
const out: Record<string, unknown> = { ...raw };
// overlay only the dot→under mappings
podsMetaMap.forEach(({ dot, under }) => {
if (dot in raw) {
const v = raw[dot];
out[under] = typeof v === 'string' ? v : raw[under];
}
});
return out as K8sPodsData['meta'];
}
// getK8sPodsList
export const getK8sPodsList = async ( export const getK8sPodsList = async (
props: K8sPodsListPayload, props: K8sPodsListPayload,
signal?: AbortSignal, signal?: AbortSignal,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled = false,
): Promise<SuccessResponse<K8sPodsListResponse> | ErrorResponse> => { ): Promise<SuccessResponse<K8sPodsListResponse> | ErrorResponse> => {
try { try {
const response = await axios.post('/pods/list', props, { const requestProps =
dotMetricsEnabled && Array.isArray(props.filters?.items)
? {
...props,
filters: {
...props.filters,
items: props.filters.items.reduce<typeof props.filters.items>(
(acc, item) => {
if (item.value === undefined) return acc;
if (
item.key &&
typeof item.key === 'object' &&
'key' in item.key &&
typeof item.key.key === 'string'
) {
const mappedKey = UnderscoreToDotMap[item.key.key] ?? item.key.key;
acc.push({
...item,
key: { ...item.key, key: mappedKey },
});
} else {
acc.push(item);
}
return acc;
},
[] as typeof props.filters.items,
),
},
}
: props;
const response = await axios.post('/pods/list', requestProps, {
signal, signal,
headers, headers,
}); });
const payload: K8sPodsListResponse = response.data;
payload.data.records = payload.data.records.map((record) => ({
...record,
meta: mapPodsMeta(record.meta as Record<string, unknown>),
}));
return { return {
statusCode: 200, statusCode: 200,
error: null, error: null,
message: 'Success', message: 'Success',
payload: response.data, payload,
params: props, params: requestProps,
}; };
} catch (error) { } catch (error) {
return ErrorResponseHandler(error as AxiosError); return ErrorResponseHandler(error as AxiosError);

View File

@ -5,6 +5,8 @@ import { ErrorResponse, SuccessResponse } from 'types/api';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { TagFilter } from 'types/api/queryBuilder/queryBuilderData'; import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
import { UnderscoreToDotMap } from '../utils';
export interface K8sVolumesListPayload { export interface K8sVolumesListPayload {
filters: TagFilter; filters: TagFilter;
groupBy?: BaseAutocompleteData[]; groupBy?: BaseAutocompleteData[];
@ -47,23 +49,92 @@ export interface K8sVolumesListResponse {
}; };
} }
export const volumesMetaMap: Array<{
dot: keyof Record<string, unknown>;
under: keyof K8sVolumesData['meta'];
}> = [
{ dot: 'k8s.cluster.name', under: 'k8s_cluster_name' },
{ dot: 'k8s.namespace.name', under: 'k8s_namespace_name' },
{ dot: 'k8s.node.name', under: 'k8s_node_name' },
{
dot: 'k8s.persistentvolumeclaim.name',
under: 'k8s_persistentvolumeclaim_name',
},
{ dot: 'k8s.pod.name', under: 'k8s_pod_name' },
{ dot: 'k8s.pod.uid', under: 'k8s_pod_uid' },
{ dot: 'k8s.statefulset.name', under: 'k8s_statefulset_name' },
];
export function mapVolumesMeta(
rawMeta: Record<string, unknown>,
): K8sVolumesData['meta'] {
// start with everything that was already there
const out: Record<string, unknown> = { ...rawMeta };
// for each dot→under rule, if the raw has the dot, overwrite the underscore
volumesMetaMap.forEach(({ dot, under }) => {
if (dot in rawMeta) {
const val = rawMeta[dot];
out[under] = typeof val === 'string' ? val : rawMeta[under];
}
});
return out as K8sVolumesData['meta'];
}
export const getK8sVolumesList = async ( export const getK8sVolumesList = async (
props: K8sVolumesListPayload, props: K8sVolumesListPayload,
signal?: AbortSignal, signal?: AbortSignal,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled = false,
): Promise<SuccessResponse<K8sVolumesListResponse> | ErrorResponse> => { ): Promise<SuccessResponse<K8sVolumesListResponse> | ErrorResponse> => {
try { try {
const response = await axios.post('/pvcs/list', props, { // Prepare filters
const requestProps =
dotMetricsEnabled && Array.isArray(props.filters?.items)
? {
...props,
filters: {
...props.filters,
items: props.filters.items.reduce<typeof props.filters.items>(
(acc, item) => {
if (item.value === undefined) return acc;
if (
item.key &&
typeof item.key === 'object' &&
'key' in item.key &&
typeof item.key.key === 'string'
) {
const mappedKey = UnderscoreToDotMap[item.key.key] ?? item.key.key;
acc.push({ ...item, key: { ...item.key, key: mappedKey } });
} else {
acc.push(item);
}
return acc;
},
[] as typeof props.filters.items,
),
},
}
: props;
const response = await axios.post('/pvcs/list', requestProps, {
signal, signal,
headers, headers,
}); });
const payload: K8sVolumesListResponse = response.data;
payload.data.records = payload.data.records.map((record) => ({
...record,
meta: mapVolumesMeta(record.meta as Record<string, unknown>),
}));
return { return {
statusCode: 200, statusCode: 200,
error: null, error: null,
message: 'Success', message: 'Success',
payload: response.data, payload,
params: props, params: requestProps,
}; };
} catch (error) { } catch (error) {
return ErrorResponseHandler(error as AxiosError); return ErrorResponseHandler(error as AxiosError);

View File

@ -5,6 +5,8 @@ import { ErrorResponse, SuccessResponse } from 'types/api';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse'; import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { TagFilter } from 'types/api/queryBuilder/queryBuilderData'; import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
import { UnderscoreToDotMap } from '../utils';
export interface K8sStatefulSetsListPayload { export interface K8sStatefulSetsListPayload {
filters: TagFilter; filters: TagFilter;
groupBy?: BaseAutocompleteData[]; groupBy?: BaseAutocompleteData[];
@ -45,23 +47,78 @@ export interface K8sStatefulSetsListResponse {
}; };
} }
export const statefulSetsMetaMap = [
{ dot: 'k8s.statefulset.name', under: 'k8s_statefulset_name' },
{ dot: 'k8s.namespace.name', under: 'k8s_namespace_name' },
] as const;
export function mapStatefulSetsMeta(
raw: Record<string, unknown>,
): K8sStatefulSetsData['meta'] {
const out: Record<string, unknown> = { ...raw };
statefulSetsMetaMap.forEach(({ dot, under }) => {
if (dot in raw) {
const v = raw[dot];
out[under] = typeof v === 'string' ? v : raw[under];
}
});
return out as K8sStatefulSetsData['meta'];
}
export const getK8sStatefulSetsList = async ( export const getK8sStatefulSetsList = async (
props: K8sStatefulSetsListPayload, props: K8sStatefulSetsListPayload,
signal?: AbortSignal, signal?: AbortSignal,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled = false,
): Promise<SuccessResponse<K8sStatefulSetsListResponse> | ErrorResponse> => { ): Promise<SuccessResponse<K8sStatefulSetsListResponse> | ErrorResponse> => {
try { try {
const response = await axios.post('/statefulsets/list', props, { // Prepare filters
const requestProps =
dotMetricsEnabled && Array.isArray(props.filters?.items)
? {
...props,
filters: {
...props.filters,
items: props.filters.items.reduce<typeof props.filters.items>(
(acc, item) => {
if (item.value === undefined) return acc;
if (
item.key &&
typeof item.key === 'object' &&
'key' in item.key &&
typeof item.key.key === 'string'
) {
const mappedKey = UnderscoreToDotMap[item.key.key] ?? item.key.key;
acc.push({ ...item, key: { ...item.key, key: mappedKey } });
} else {
acc.push(item);
}
return acc;
},
[] as typeof props.filters.items,
),
},
}
: props;
const response = await axios.post('/statefulsets/list', requestProps, {
signal, signal,
headers, headers,
}); });
const payload: K8sStatefulSetsListResponse = response.data;
// apply our helper
payload.data.records = payload.data.records.map((record) => ({
...record,
meta: mapStatefulSetsMeta(record.meta as Record<string, unknown>),
}));
return { return {
statusCode: 200, statusCode: 200,
error: null, error: null,
message: 'Success', message: 'Success',
payload: response.data, payload,
params: props, params: requestProps,
}; };
} catch (error) { } catch (error) {
return ErrorResponseHandler(error as AxiosError); return ErrorResponseHandler(error as AxiosError);

View File

@ -17,3 +17,19 @@ export const Logout = (): void => {
history.push(ROUTES.LOGIN); history.push(ROUTES.LOGIN);
}; };
export const UnderscoreToDotMap: Record<string, string> = {
k8s_cluster_name: 'k8s.cluster.name',
k8s_cluster_uid: 'k8s.cluster.uid',
k8s_namespace_name: 'k8s.namespace.name',
k8s_node_name: 'k8s.node.name',
k8s_node_uid: 'k8s.node.uid',
k8s_pod_name: 'k8s.pod.name',
k8s_pod_uid: 'k8s.pod.uid',
k8s_deployment_name: 'k8s.deployment.name',
k8s_daemonset_name: 'k8s.daemonset.name',
k8s_statefulset_name: 'k8s.statefulset.name',
k8s_cronjob_name: 'k8s.cronjob.name',
k8s_job_name: 'k8s.job.name',
k8s_persistentvolumeclaim_name: 'k8s.persistentvolumeclaim.name',
};

View File

@ -23,6 +23,9 @@ import { useQueries, UseQueryResult } from 'react-query';
import { SuccessResponse } from 'types/api'; import { SuccessResponse } from 'types/api';
import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange'; import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
interface MetricsTabProps { interface MetricsTabProps {
timeRange: { timeRange: {
startTime: number; startTime: number;
@ -45,9 +48,20 @@ function Metrics({
handleTimeChange, handleTimeChange,
isModalTimeSelection, isModalTimeSelection,
}: MetricsTabProps): JSX.Element { }: MetricsTabProps): JSX.Element {
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const queryPayloads = useMemo( const queryPayloads = useMemo(
() => getHostQueryPayload(hostName, timeRange.startTime, timeRange.endTime), () =>
[hostName, timeRange.startTime, timeRange.endTime], getHostQueryPayload(
hostName,
timeRange.startTime,
timeRange.endTime,
dotMetricsEnabled,
),
[hostName, timeRange.startTime, timeRange.endTime, dotMetricsEnabled],
); );
const queries = useQueries( const queries = useQueries(

View File

@ -10,4 +10,5 @@ export enum FeatureKeys {
ONBOARDING_V3 = 'ONBOARDING_V3', ONBOARDING_V3 = 'ONBOARDING_V3',
THIRD_PARTY_API = 'THIRD_PARTY_API', THIRD_PARTY_API = 'THIRD_PARTY_API',
TRACE_FUNNELS = 'TRACE_FUNNELS', TRACE_FUNNELS = 'TRACE_FUNNELS',
DOT_METRICS_ENABLED = 'DOT_METRICS_ENABLED',
} }

View File

@ -21,7 +21,10 @@ import ROUTES from 'constants/routes';
import { useGetCompositeQueryParam } from 'hooks/queryBuilder/useGetCompositeQueryParam'; import { useGetCompositeQueryParam } from 'hooks/queryBuilder/useGetCompositeQueryParam';
import { useNotifications } from 'hooks/useNotifications'; import { useNotifications } from 'hooks/useNotifications';
import useResourceAttribute from 'hooks/useResourceAttribute'; import useResourceAttribute from 'hooks/useResourceAttribute';
import { convertCompositeQueryToTraceSelectedTags } from 'hooks/useResourceAttribute/utils'; import {
convertCompositeQueryToTraceSelectedTags,
getResourceDeploymentKeys,
} from 'hooks/useResourceAttribute/utils';
import { TimestampInput } from 'hooks/useTimezoneFormatter/useTimezoneFormatter'; import { TimestampInput } from 'hooks/useTimezoneFormatter/useTimezoneFormatter';
import useUrlQuery from 'hooks/useUrlQuery'; import useUrlQuery from 'hooks/useUrlQuery';
import createQueryParams from 'lib/createQueryParams'; import createQueryParams from 'lib/createQueryParams';
@ -38,6 +41,8 @@ import { ErrorResponse, SuccessResponse } from 'types/api';
import { Exception, PayloadProps } from 'types/api/errors/getAll'; import { Exception, PayloadProps } from 'types/api/errors/getAll';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../constants/features';
import { useAppContext } from '../../providers/App/App';
import { FilterDropdownExtendsProps } from './types'; import { FilterDropdownExtendsProps } from './types';
import { import {
extractFilterValues, extractFilterValues,
@ -405,6 +410,11 @@ function AllErrors(): JSX.Element {
}, },
]; ];
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const onChangeHandler: TableProps<Exception>['onChange'] = useCallback( const onChangeHandler: TableProps<Exception>['onChange'] = useCallback(
( (
paginations: TablePaginationConfig, paginations: TablePaginationConfig,
@ -438,7 +448,7 @@ function AllErrors(): JSX.Element {
useEffect(() => { useEffect(() => {
if (!isUndefined(errorCountResponse.data?.payload)) { if (!isUndefined(errorCountResponse.data?.payload)) {
const selectedEnvironments = queries.find( const selectedEnvironments = queries.find(
(val) => val.tagKey === 'resource_deployment_environment', (val) => val.tagKey === getResourceDeploymentKeys(dotMetricsEnabled),
)?.tagValue; )?.tagValue;
logEvent('Exception: List page visited', { logEvent('Exception: List page visited', {

View File

@ -10,6 +10,8 @@ import { Provider, useSelector } from 'react-redux';
import { MemoryRouter } from 'react-router-dom'; import { MemoryRouter } from 'react-router-dom';
import store from 'store'; import store from 'store';
import * as appContextHooks from '../../../providers/App/App';
import { LicenseEvent } from '../../../types/api/licensesV3/getActive';
import AllErrors from '../index'; import AllErrors from '../index';
import { import {
INIT_URL_WITH_COMMON_QUERY, INIT_URL_WITH_COMMON_QUERY,
@ -28,6 +30,30 @@ jest.mock('react-redux', () => ({
useSelector: jest.fn(), useSelector: jest.fn(),
})); }));
jest.spyOn(appContextHooks, 'useAppContext').mockReturnValue({
user: {
role: 'admin',
},
activeLicenseV3: {
event_queue: {
created_at: '0',
event: LicenseEvent.NO_EVENT,
scheduled_at: '0',
status: '',
updated_at: '0',
},
license: {
license_key: 'test-license-key',
license_type: 'trial',
org_id: 'test-org-id',
plan_id: 'test-plan-id',
plan_name: 'test-plan-name',
plan_type: 'trial',
plan_version: 'test-plan-version',
},
},
} as any);
function Exceptions({ initUrl }: { initUrl?: string[] }): JSX.Element { function Exceptions({ initUrl }: { initUrl?: string[] }): JSX.Element {
return ( return (
<MemoryRouter initialEntries={initUrl ?? ['/exceptions']}> <MemoryRouter initialEntries={initUrl ?? ['/exceptions']}>

View File

@ -10,6 +10,7 @@ import getAllUserPreferences from 'api/preferences/getAllUserPreference';
import updateUserPreferenceAPI from 'api/preferences/updateUserPreference'; import updateUserPreferenceAPI from 'api/preferences/updateUserPreference';
import Header from 'components/Header/Header'; import Header from 'components/Header/Header';
import { DEFAULT_ENTITY_VERSION } from 'constants/app'; import { DEFAULT_ENTITY_VERSION } from 'constants/app';
import { FeatureKeys } from 'constants/features';
import { LOCALSTORAGE } from 'constants/localStorage'; import { LOCALSTORAGE } from 'constants/localStorage';
import { initialQueriesMap, PANEL_TYPES } from 'constants/queryBuilder'; import { initialQueriesMap, PANEL_TYPES } from 'constants/queryBuilder';
import { REACT_QUERY_KEY } from 'constants/reactQueryKeys'; import { REACT_QUERY_KEY } from 'constants/reactQueryKeys';
@ -161,10 +162,20 @@ export default function Home(): JSX.Element {
enabled: !!query, enabled: !!query,
}); });
const { data: k8sPodsData } = useGetK8sPodsList(query as K8sPodsListPayload, { const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const { data: k8sPodsData } = useGetK8sPodsList(
query as K8sPodsListPayload,
{
queryKey: ['K8sPodsList', query], queryKey: ['K8sPodsList', query],
enabled: !!query, enabled: !!query,
}); },
undefined,
dotMetricsEnabled,
);
const [isLogsIngestionActive, setIsLogsIngestionActive] = useState(false); const [isLogsIngestionActive, setIsLogsIngestionActive] = useState(false);
const [isTracesIngestionActive, setIsTracesIngestionActive] = useState(false); const [isTracesIngestionActive, setIsTracesIngestionActive] = useState(false);

View File

@ -30,6 +30,7 @@ import { GlobalReducer } from 'types/reducer/globalTime';
import { Tags } from 'types/reducer/trace'; import { Tags } from 'types/reducer/trace';
import { USER_ROLES } from 'types/roles'; import { USER_ROLES } from 'types/roles';
import { FeatureKeys } from '../../../constants/features';
import { DOCS_LINKS } from '../constants'; import { DOCS_LINKS } from '../constants';
import { columns, TIME_PICKER_OPTIONS } from './constants'; import { columns, TIME_PICKER_OPTIONS } from './constants';
@ -210,6 +211,11 @@ function ServiceMetrics({
const topLevelOperations = useMemo(() => Object.entries(data || {}), [data]); const topLevelOperations = useMemo(() => Object.entries(data || {}), [data]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const queryRangeRequestData = useMemo( const queryRangeRequestData = useMemo(
() => () =>
getQueryRangeRequestData({ getQueryRangeRequestData({
@ -217,12 +223,14 @@ function ServiceMetrics({
minTime: timeRange.startTime * 1e6, minTime: timeRange.startTime * 1e6,
maxTime: timeRange.endTime * 1e6, maxTime: timeRange.endTime * 1e6,
globalSelectedInterval, globalSelectedInterval,
dotMetricsEnabled,
}), }),
[ [
globalSelectedInterval, globalSelectedInterval,
timeRange.endTime, timeRange.endTime,
timeRange.startTime, timeRange.startTime,
topLevelOperations, topLevelOperations,
dotMetricsEnabled,
], ],
); );

View File

@ -25,9 +25,11 @@ import { AppState } from 'store/reducers';
import { IBuilderQuery, Query } from 'types/api/queryBuilder/queryBuilderData'; import { IBuilderQuery, Query } from 'types/api/queryBuilder/queryBuilderData';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../constants/features';
import { useAppContext } from '../../providers/App/App';
import HostsListControls from './HostsListControls'; import HostsListControls from './HostsListControls';
import HostsListTable from './HostsListTable'; import HostsListTable from './HostsListTable';
import { getHostListsQuery, HostsQuickFiltersConfig } from './utils'; import { getHostListsQuery, GetHostsQuickFiltersConfig } from './utils';
// eslint-disable-next-line sonarjs/cognitive-complexity // eslint-disable-next-line sonarjs/cognitive-complexity
function HostsList(): JSX.Element { function HostsList(): JSX.Element {
const { maxTime, minTime } = useSelector<AppState, GlobalReducer>( const { maxTime, minTime } = useSelector<AppState, GlobalReducer>(
@ -114,6 +116,11 @@ function HostsList(): JSX.Element {
entityVersion: '', entityVersion: '',
}); });
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const handleFiltersChange = useCallback( const handleFiltersChange = useCallback(
(value: IBuilderQuery['filters']): void => { (value: IBuilderQuery['filters']): void => {
const isNewFilterAdded = value.items.length !== filters.items.length; const isNewFilterAdded = value.items.length !== filters.items.length;
@ -182,7 +189,7 @@ function HostsList(): JSX.Element {
</div> </div>
<QuickFilters <QuickFilters
source={QuickFiltersSource.INFRA_MONITORING} source={QuickFiltersSource.INFRA_MONITORING}
config={HostsQuickFiltersConfig} config={GetHostsQuickFiltersConfig(dotMetricsEnabled)}
handleFilterVisibilityChange={handleFilterVisibilityChange} handleFilterVisibilityChange={handleFilterVisibilityChange}
onFilterChange={handleQuickFiltersChange} onFilterChange={handleQuickFiltersChange}
/> />

View File

@ -198,3 +198,48 @@ export const HostsQuickFiltersConfig: IQuickFiltersConfig[] = [
defaultOpen: true, defaultOpen: true,
}, },
]; ];
export function GetHostsQuickFiltersConfig(
dotMetricsEnabled: boolean,
): IQuickFiltersConfig[] {
// These keys dont change with dotMetricsEnabled
const hostNameKey = dotMetricsEnabled ? 'host.name' : 'host_name';
const osTypeKey = dotMetricsEnabled ? 'os.type' : 'os_type';
// This metric stays the same regardless of notation
const metricName = dotMetricsEnabled
? 'system.cpu.load_average.15m'
: 'system_cpu_load_average_15m';
return [
{
type: FiltersType.CHECKBOX,
title: 'Host Name',
attributeKey: {
key: hostNameKey,
dataType: DataTypes.String,
type: 'resource',
isColumn: false,
isJSON: false,
},
aggregateOperator: 'noop',
aggregateAttribute: metricName,
dataSource: DataSource.METRICS,
defaultOpen: true,
},
{
type: FiltersType.CHECKBOX,
title: 'OS Type',
attributeKey: {
key: osTypeKey,
dataType: DataTypes.String,
type: 'resource',
isColumn: false,
isJSON: false,
},
aggregateOperator: 'noop',
aggregateAttribute: metricName,
dataSource: DataSource.METRICS,
defaultOpen: true,
},
];
}

View File

@ -28,11 +28,13 @@ import { AppState } from 'store/reducers';
import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { getOrderByFromParams } from '../commonUtils'; import { getOrderByFromParams } from '../commonUtils';
import { import {
GetK8sEntityToAggregateAttribute,
INFRA_MONITORING_K8S_PARAMS_KEYS, INFRA_MONITORING_K8S_PARAMS_KEYS,
K8sCategory, K8sCategory,
K8sEntityToAggregateAttributeMapping,
} from '../constants'; } from '../constants';
import K8sHeader from '../K8sHeader'; import K8sHeader from '../K8sHeader';
import LoadingContainer from '../LoadingContainer'; import LoadingContainer from '../LoadingContainer';
@ -135,6 +137,11 @@ function K8sClustersList({
} }
}, [quickFiltersLastUpdated]); }, [quickFiltersLastUpdated]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const createFiltersForSelectedRowData = ( const createFiltersForSelectedRowData = (
selectedRowData: K8sClustersRowData, selectedRowData: K8sClustersRowData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -194,6 +201,8 @@ function K8sClustersList({
queryKey: ['clusterList', fetchGroupedByRowDataQuery], queryKey: ['clusterList', fetchGroupedByRowDataQuery],
enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData, enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData,
}, },
undefined,
dotMetricsEnabled,
); );
const { const {
@ -202,8 +211,10 @@ function K8sClustersList({
} = useGetAggregateKeys( } = useGetAggregateKeys(
{ {
dataSource: currentQuery.builder.queryData[0].dataSource, dataSource: currentQuery.builder.queryData[0].dataSource,
aggregateAttribute: aggregateAttribute: GetK8sEntityToAggregateAttribute(
K8sEntityToAggregateAttributeMapping[K8sCategory.CLUSTERS], K8sCategory.CLUSTERS,
dotMetricsEnabled,
),
aggregateOperator: 'noop', aggregateOperator: 'noop',
searchText: '', searchText: '',
tagType: '', tagType: '',
@ -249,6 +260,8 @@ function K8sClustersList({
queryKey: ['clusterList', query], queryKey: ['clusterList', query],
enabled: !!query, enabled: !!query,
}, },
undefined,
dotMetricsEnabled,
); );
const clustersData = useMemo(() => data?.payload?.data?.records || [], [data]); const clustersData = useMemo(() => data?.payload?.data?.records || [], [data]);

View File

@ -136,6 +136,11 @@ export const getK8sClustersListColumns = (
return columnsConfig as ColumnType<K8sClustersRowData>[]; return columnsConfig as ColumnType<K8sClustersRowData>[];
}; };
const dotToUnder: Record<string, keyof K8sClustersData['meta']> = {
'k8s.cluster.name': 'k8s_cluster_name',
'k8s.cluster.uid': 'k8s_cluster_uid',
};
const getGroupByEle = ( const getGroupByEle = (
cluster: K8sClustersData, cluster: K8sClustersData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -143,7 +148,13 @@ const getGroupByEle = (
const groupByValues: string[] = []; const groupByValues: string[] = [];
groupBy.forEach((group) => { groupBy.forEach((group) => {
groupByValues.push(cluster.meta[group.key as keyof typeof cluster.meta]); const rawKey = group.key as string;
// Choose mapped key if present, otherwise use rawKey
const metaKey = (dotToUnder[rawKey] ?? rawKey) as keyof typeof cluster.meta;
const value = cluster.meta[metaKey];
groupByValues.push(value);
}); });
return ( return (

View File

@ -30,7 +30,51 @@ export const getDaemonSetMetricsQueryPayload = (
daemonSet: K8sDaemonSetsData, daemonSet: K8sDaemonSetsData,
start: number, start: number,
end: number, end: number,
): GetQueryResultsProps[] => [ dotMetricsEnabled: boolean,
): GetQueryResultsProps[] => {
const k8sPodCpuUtilizationKey = dotMetricsEnabled
? 'k8s.pod.cpu.utilization'
: 'k8s_pod_cpu_utilization';
const k8sContainerCpuRequestKey = dotMetricsEnabled
? 'k8s.container.cpu_request'
: 'k8s_container_cpu_request';
const k8sContainerCpuLimitKey = dotMetricsEnabled
? 'k8s.container.cpu_limit'
: 'k8s_container_cpu_limit';
const k8sPodMemoryUsageKey = dotMetricsEnabled
? 'k8s.pod.memory.usage'
: 'k8s_pod_memory_usage';
const k8sContainerMemoryRequestKey = dotMetricsEnabled
? 'k8s.container.memory_request'
: 'k8s_container_memory_request';
const k8sContainerMemoryLimitKey = dotMetricsEnabled
? 'k8s.container.memory_limit'
: 'k8s_container_memory_limit';
const k8sPodNetworkIoKey = dotMetricsEnabled
? 'k8s.pod.network.io'
: 'k8s_pod_network_io';
const k8sPodNetworkErrorsKey = dotMetricsEnabled
? 'k8s.pod.network.errors'
: 'k8s_pod_network_errors';
const k8sDaemonSetNameKey = dotMetricsEnabled
? 'k8s.daemonset.name'
: 'k8s_daemonset_name';
const k8sPodNameKey = dotMetricsEnabled ? 'k8s.pod.name' : 'k8s_pod_name';
const k8sNamespaceNameKey = dotMetricsEnabled
? 'k8s.namespace.name'
: 'k8s_namespace_name';
return [
{ {
selectedTime: 'GLOBAL_TIME', selectedTime: 'GLOBAL_TIME',
graphType: PANEL_TYPES.TIME_SERIES, graphType: PANEL_TYPES.TIME_SERIES,
@ -43,7 +87,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_pod_cpu_utilization--float64--Gauge--true', id: 'k8s_pod_cpu_utilization--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_cpu_utilization', key: k8sPodCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -59,7 +103,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_daemonset_name--string--tag--false', id: 'k8s_daemonset_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_name', key: k8sDaemonSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -72,7 +116,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -99,7 +143,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_container_cpu_request--float64--Gauge--true', id: 'k8s_container_cpu_request--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_cpu_request', key: k8sContainerCpuRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -115,7 +159,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_pod_name--string--tag--false', id: 'k8s_pod_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
@ -128,7 +172,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -155,7 +199,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_container_cpu_limit--float64--Gauge--true', id: 'k8s_container_cpu_limit--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_cpu_limit', key: k8sContainerCpuLimitKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -171,7 +215,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_pod_name--string--tag--false', id: 'k8s_pod_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
@ -184,7 +228,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -244,7 +288,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_pod_memory_usage--float64--Gauge--true', id: 'k8s_pod_memory_usage--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_usage', key: k8sPodMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -260,7 +304,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_daemonset_name--string--tag--false', id: 'k8s_daemonset_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_name', key: k8sDaemonSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -273,7 +317,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -300,7 +344,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_container_memory_request--float64--Gauge--true', id: 'k8s_container_memory_request--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_memory_request', key: k8sContainerMemoryRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -316,7 +360,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_pod_name--string--tag--false', id: 'k8s_pod_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
@ -329,7 +373,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -356,7 +400,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_container_memory_limit--float64--Gauge--true', id: 'k8s_container_memory_limit--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_memory_limit', key: k8sContainerMemoryLimitKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -372,7 +416,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_pod_name--string--tag--false', id: 'k8s_pod_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
@ -385,7 +429,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -445,7 +489,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_pod_network_io--float64--Sum--true', id: 'k8s_pod_network_io--float64--Sum--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_network_io', key: k8sPodNetworkIoKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'rate', aggregateOperator: 'rate',
@ -461,7 +505,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_daemonset_name--string--tag--false', id: 'k8s_daemonset_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_name', key: k8sDaemonSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -474,7 +518,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -551,7 +595,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_pod_network_errors--float64--Sum--true', id: 'k8s_pod_network_errors--float64--Sum--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_network_errors', key: k8sPodNetworkErrorsKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'increase', aggregateOperator: 'increase',
@ -567,7 +611,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_daemonset_name--string--tag--false', id: 'k8s_daemonset_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_name', key: k8sDaemonSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -580,7 +624,7 @@ export const getDaemonSetMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -646,3 +690,4 @@ export const getDaemonSetMetricsQueryPayload = (
end, end,
}, },
]; ];
};

View File

@ -29,11 +29,13 @@ import { AppState } from 'store/reducers';
import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { getOrderByFromParams } from '../commonUtils'; import { getOrderByFromParams } from '../commonUtils';
import { import {
GetK8sEntityToAggregateAttribute,
INFRA_MONITORING_K8S_PARAMS_KEYS, INFRA_MONITORING_K8S_PARAMS_KEYS,
K8sCategory, K8sCategory,
K8sEntityToAggregateAttributeMapping,
} from '../constants'; } from '../constants';
import K8sHeader from '../K8sHeader'; import K8sHeader from '../K8sHeader';
import LoadingContainer from '../LoadingContainer'; import LoadingContainer from '../LoadingContainer';
@ -137,6 +139,11 @@ function K8sDaemonSetsList({
} }
}, [quickFiltersLastUpdated]); }, [quickFiltersLastUpdated]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const createFiltersForSelectedRowData = ( const createFiltersForSelectedRowData = (
selectedRowData: K8sDaemonSetsRowData, selectedRowData: K8sDaemonSetsRowData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -196,6 +203,8 @@ function K8sDaemonSetsList({
queryKey: ['daemonSetList', fetchGroupedByRowDataQuery], queryKey: ['daemonSetList', fetchGroupedByRowDataQuery],
enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData, enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData,
}, },
undefined,
dotMetricsEnabled,
); );
const { const {
@ -204,8 +213,10 @@ function K8sDaemonSetsList({
} = useGetAggregateKeys( } = useGetAggregateKeys(
{ {
dataSource: currentQuery.builder.queryData[0].dataSource, dataSource: currentQuery.builder.queryData[0].dataSource,
aggregateAttribute: aggregateAttribute: GetK8sEntityToAggregateAttribute(
K8sEntityToAggregateAttributeMapping[K8sCategory.DAEMONSETS], K8sCategory.DAEMONSETS,
dotMetricsEnabled,
),
aggregateOperator: 'noop', aggregateOperator: 'noop',
searchText: '', searchText: '',
tagType: '', tagType: '',
@ -246,6 +257,8 @@ function K8sDaemonSetsList({
queryKey: ['daemonSetList', query], queryKey: ['daemonSetList', query],
enabled: !!query, enabled: !!query,
}, },
undefined,
dotMetricsEnabled,
); );
const daemonSetsData = useMemo(() => data?.payload?.data?.records || [], [ const daemonSetsData = useMemo(() => data?.payload?.data?.records || [], [

View File

@ -236,6 +236,12 @@ export const getK8sDaemonSetsListColumns = (
return columnsConfig as ColumnType<K8sDaemonSetsRowData>[]; return columnsConfig as ColumnType<K8sDaemonSetsRowData>[];
}; };
const dotToUnder: Record<string, keyof K8sDaemonSetsData['meta']> = {
'k8s.daemonset.name': 'k8s_daemonset_name',
'k8s.namespace.name': 'k8s_namespace_name',
'k8s.cluster.name': 'k8s_cluster_name',
};
const getGroupByEle = ( const getGroupByEle = (
daemonSet: K8sDaemonSetsData, daemonSet: K8sDaemonSetsData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -243,7 +249,13 @@ const getGroupByEle = (
const groupByValues: string[] = []; const groupByValues: string[] = [];
groupBy.forEach((group) => { groupBy.forEach((group) => {
groupByValues.push(daemonSet.meta[group.key as keyof typeof daemonSet.meta]); const rawKey = group.key as string;
// Choose mapped key if present, otherwise use rawKey
const metaKey = (dotToUnder[rawKey] ?? rawKey) as keyof typeof daemonSet.meta;
const value = daemonSet.meta[metaKey];
groupByValues.push(value);
}); });
return ( return (

View File

@ -30,7 +30,47 @@ export const getDeploymentMetricsQueryPayload = (
deployment: K8sDeploymentsData, deployment: K8sDeploymentsData,
start: number, start: number,
end: number, end: number,
): GetQueryResultsProps[] => [ dotMetricsEnabled: boolean,
): GetQueryResultsProps[] => {
const k8sPodCpuUtilizationKey = dotMetricsEnabled
? 'k8s.pod.cpu.utilization'
: 'k8s_pod_cpu_utilization';
const k8sContainerCpuRequestKey = dotMetricsEnabled
? 'k8s.container.cpu_request'
: 'k8s_container_cpu_request';
const k8sContainerCpuLimitKey = dotMetricsEnabled
? 'k8s.container.cpu_limit'
: 'k8s_container_cpu_limit';
const k8sPodMemoryUsageKey = dotMetricsEnabled
? 'k8s.pod.memory.usage'
: 'k8s_pod_memory_usage';
const k8sContainerMemoryRequestKey = dotMetricsEnabled
? 'k8s.container.memory_request'
: 'k8s_container_memory_request';
const k8sContainerMemoryLimitKey = dotMetricsEnabled
? 'k8s.container.memory_limit'
: 'k8s_container_memory_limit';
const k8sPodNetworkIoKey = dotMetricsEnabled
? 'k8s.pod.network.io'
: 'k8s_pod_network_io';
const k8sPodNetworkErrorsKey = dotMetricsEnabled
? 'k8s.pod.network.errors'
: 'k8s_pod_network_errors';
const k8sDeploymentNameKey = dotMetricsEnabled
? 'k8s.deployment.name'
: 'k8s_deployment_name';
const k8sPodNameKey = dotMetricsEnabled ? 'k8s.pod.name' : 'k8s_pod_name';
return [
{ {
selectedTime: 'GLOBAL_TIME', selectedTime: 'GLOBAL_TIME',
graphType: PANEL_TYPES.TIME_SERIES, graphType: PANEL_TYPES.TIME_SERIES,
@ -43,7 +83,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_pod_cpu_utilization--float64--Gauge--true', id: 'k8s_pod_cpu_utilization--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_cpu_utilization', key: k8sPodCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -59,7 +99,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_deployment_name--string--tag--false', id: 'k8s_deployment_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_deployment_name', key: k8sDeploymentNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -86,7 +126,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_container_cpu_request--float64--Gauge--true', id: 'k8s_container_cpu_request--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_cpu_request', key: k8sContainerCpuRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -102,7 +142,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_pod_name--string--tag--false', id: 'k8s_pod_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
@ -129,7 +169,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_container_cpu_limit--float64--Gauge--true', id: 'k8s_container_cpu_limit--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_cpu_limit', key: k8sContainerCpuLimitKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -145,7 +185,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_pod_name--string--tag--false', id: 'k8s_pod_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
@ -205,7 +245,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_pod_memory_usage--float64--Gauge--true', id: 'k8s_pod_memory_usage--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_usage', key: k8sPodMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -221,7 +261,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_deployment_name--string--tag--false', id: 'k8s_deployment_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_deployment_name', key: k8sDeploymentNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -248,7 +288,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_container_memory_request--float64--Gauge--true', id: 'k8s_container_memory_request--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_memory_request', key: k8sContainerMemoryRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -264,7 +304,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_pod_name--string--tag--false', id: 'k8s_pod_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
@ -291,7 +331,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_container_memory_limit--float64--Gauge--true', id: 'k8s_container_memory_limit--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_memory_limit', key: k8sContainerMemoryLimitKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -307,7 +347,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_pod_name--string--tag--false', id: 'k8s_pod_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
@ -367,7 +407,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_pod_network_io--float64--Sum--true', id: 'k8s_pod_network_io--float64--Sum--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_network_io', key: k8sPodNetworkIoKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'rate', aggregateOperator: 'rate',
@ -383,7 +423,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_deployment_name--string--tag--false', id: 'k8s_deployment_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_deployment_name', key: k8sDeploymentNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -460,7 +500,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_pod_network_errors--float64--Sum--true', id: 'k8s_pod_network_errors--float64--Sum--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_network_errors', key: k8sPodNetworkErrorsKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'increase', aggregateOperator: 'increase',
@ -476,7 +516,7 @@ export const getDeploymentMetricsQueryPayload = (
id: 'k8s_deployment_name--string--tag--false', id: 'k8s_deployment_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_deployment_name', key: k8sDeploymentNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -542,3 +582,4 @@ export const getDeploymentMetricsQueryPayload = (
end, end,
}, },
]; ];
};

View File

@ -29,11 +29,13 @@ import { AppState } from 'store/reducers';
import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { getOrderByFromParams } from '../commonUtils'; import { getOrderByFromParams } from '../commonUtils';
import { import {
GetK8sEntityToAggregateAttribute,
INFRA_MONITORING_K8S_PARAMS_KEYS, INFRA_MONITORING_K8S_PARAMS_KEYS,
K8sCategory, K8sCategory,
K8sEntityToAggregateAttributeMapping,
} from '../constants'; } from '../constants';
import K8sHeader from '../K8sHeader'; import K8sHeader from '../K8sHeader';
import LoadingContainer from '../LoadingContainer'; import LoadingContainer from '../LoadingContainer';
@ -138,6 +140,11 @@ function K8sDeploymentsList({
} }
}, [quickFiltersLastUpdated]); }, [quickFiltersLastUpdated]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const createFiltersForSelectedRowData = ( const createFiltersForSelectedRowData = (
selectedRowData: K8sDeploymentsRowData, selectedRowData: K8sDeploymentsRowData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -197,6 +204,8 @@ function K8sDeploymentsList({
queryKey: ['deploymentList', fetchGroupedByRowDataQuery], queryKey: ['deploymentList', fetchGroupedByRowDataQuery],
enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData, enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData,
}, },
undefined,
dotMetricsEnabled,
); );
const { const {
@ -205,8 +214,10 @@ function K8sDeploymentsList({
} = useGetAggregateKeys( } = useGetAggregateKeys(
{ {
dataSource: currentQuery.builder.queryData[0].dataSource, dataSource: currentQuery.builder.queryData[0].dataSource,
aggregateAttribute: aggregateAttribute: GetK8sEntityToAggregateAttribute(
K8sEntityToAggregateAttributeMapping[K8sCategory.DEPLOYMENTS], K8sCategory.DEPLOYMENTS,
dotMetricsEnabled,
),
aggregateOperator: 'noop', aggregateOperator: 'noop',
searchText: '', searchText: '',
tagType: '', tagType: '',
@ -247,6 +258,8 @@ function K8sDeploymentsList({
queryKey: ['deploymentList', query], queryKey: ['deploymentList', query],
enabled: !!query, enabled: !!query,
}, },
undefined,
dotMetricsEnabled,
); );
const deploymentsData = useMemo(() => data?.payload?.data?.records || [], [ const deploymentsData = useMemo(() => data?.payload?.data?.records || [], [

View File

@ -226,6 +226,12 @@ export const getK8sDeploymentsListColumns = (
return columnsConfig as ColumnType<K8sDeploymentsRowData>[]; return columnsConfig as ColumnType<K8sDeploymentsRowData>[];
}; };
const dotToUnder: Record<string, keyof K8sDeploymentsData['meta']> = {
'k8s.deployment.name': 'k8s_deployment_name',
'k8s.namespace.name': 'k8s_namespace_name',
'k8s.cluster.name': 'k8s_cluster_name',
};
const getGroupByEle = ( const getGroupByEle = (
deployment: K8sDeploymentsData, deployment: K8sDeploymentsData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -233,9 +239,14 @@ const getGroupByEle = (
const groupByValues: string[] = []; const groupByValues: string[] = [];
groupBy.forEach((group) => { groupBy.forEach((group) => {
groupByValues.push( const rawKey = group.key as string;
deployment.meta[group.key as keyof typeof deployment.meta],
); // Choose mapped key if present, otherwise use rawKey
const metaKey = (dotToUnder[rawKey] ??
rawKey) as keyof typeof deployment.meta;
const value = deployment.meta[metaKey];
groupByValues.push(value);
}); });
return ( return (

View File

@ -29,6 +29,9 @@ import { SuccessResponse } from 'types/api';
import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange'; import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange';
import { Options } from 'uplot'; import { Options } from 'uplot';
import { FeatureKeys } from '../../../../constants/features';
import { useAppContext } from '../../../../providers/App/App';
interface EntityMetricsProps<T> { interface EntityMetricsProps<T> {
timeRange: { timeRange: {
startTime: number; startTime: number;
@ -49,6 +52,7 @@ interface EntityMetricsProps<T> {
node: T, node: T,
start: number, start: number,
end: number, end: number,
dotMetricsEnabled: boolean,
) => GetQueryResultsProps[]; ) => GetQueryResultsProps[];
queryKey: string; queryKey: string;
category: K8sCategory; category: K8sCategory;
@ -65,9 +69,25 @@ function EntityMetrics<T>({
queryKey, queryKey,
category, category,
}: EntityMetricsProps<T>): JSX.Element { }: EntityMetricsProps<T>): JSX.Element {
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const queryPayloads = useMemo( const queryPayloads = useMemo(
() => getEntityQueryPayload(entity, timeRange.startTime, timeRange.endTime), () =>
[getEntityQueryPayload, entity, timeRange.startTime, timeRange.endTime], getEntityQueryPayload(
entity,
timeRange.startTime,
timeRange.endTime,
dotMetricsEnabled,
),
[
getEntityQueryPayload,
entity,
timeRange.startTime,
timeRange.endTime,
dotMetricsEnabled,
],
); );
const queries = useQueries( const queries = useQueries(

View File

@ -26,19 +26,21 @@ import { useState } from 'react';
import { useSearchParams } from 'react-router-dom-v5-compat'; import { useSearchParams } from 'react-router-dom-v5-compat';
import { Query } from 'types/api/queryBuilder/queryBuilderData'; import { Query } from 'types/api/queryBuilder/queryBuilderData';
import { FeatureKeys } from '../../constants/features';
import { useAppContext } from '../../providers/App/App';
import K8sClustersList from './Clusters/K8sClustersList'; import K8sClustersList from './Clusters/K8sClustersList';
import { import {
ClustersQuickFiltersConfig, GetClustersQuickFiltersConfig,
DaemonSetsQuickFiltersConfig, GetDaemonsetsQuickFiltersConfig,
DeploymentsQuickFiltersConfig, GetDeploymentsQuickFiltersConfig,
GetJobsQuickFiltersConfig,
GetNamespaceQuickFiltersConfig,
GetNodesQuickFiltersConfig,
GetPodsQuickFiltersConfig,
GetStatefulsetsQuickFiltersConfig,
GetVolumesQuickFiltersConfig,
INFRA_MONITORING_K8S_PARAMS_KEYS, INFRA_MONITORING_K8S_PARAMS_KEYS,
JobsQuickFiltersConfig,
K8sCategories, K8sCategories,
NamespaceQuickFiltersConfig,
NodesQuickFiltersConfig,
PodsQuickFiltersConfig,
StatefulsetsQuickFiltersConfig,
VolumesQuickFiltersConfig,
} from './constants'; } from './constants';
import K8sDaemonSetsList from './DaemonSets/K8sDaemonSetsList'; import K8sDaemonSetsList from './DaemonSets/K8sDaemonSetsList';
import K8sDeploymentsList from './Deployments/K8sDeploymentsList'; import K8sDeploymentsList from './Deployments/K8sDeploymentsList';
@ -74,6 +76,11 @@ export default function InfraMonitoringK8s(): JSX.Element {
entityVersion: '', entityVersion: '',
}); });
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const handleFilterChange = (query: Query): void => { const handleFilterChange = (query: Query): void => {
// update the current query with the new filters // update the current query with the new filters
// in infra monitoring k8s, we are using only one query, hence updating the 0th index of queryData // in infra monitoring k8s, we are using only one query, hence updating the 0th index of queryData
@ -109,7 +116,7 @@ export default function InfraMonitoringK8s(): JSX.Element {
children: ( children: (
<QuickFilters <QuickFilters
source={QuickFiltersSource.INFRA_MONITORING} source={QuickFiltersSource.INFRA_MONITORING}
config={PodsQuickFiltersConfig} config={GetPodsQuickFiltersConfig(dotMetricsEnabled)}
handleFilterVisibilityChange={handleFilterVisibilityChange} handleFilterVisibilityChange={handleFilterVisibilityChange}
onFilterChange={handleFilterChange} onFilterChange={handleFilterChange}
/> />
@ -129,7 +136,7 @@ export default function InfraMonitoringK8s(): JSX.Element {
children: ( children: (
<QuickFilters <QuickFilters
source={QuickFiltersSource.INFRA_MONITORING} source={QuickFiltersSource.INFRA_MONITORING}
config={NodesQuickFiltersConfig} config={GetNodesQuickFiltersConfig(dotMetricsEnabled)}
handleFilterVisibilityChange={handleFilterVisibilityChange} handleFilterVisibilityChange={handleFilterVisibilityChange}
onFilterChange={handleFilterChange} onFilterChange={handleFilterChange}
/> />
@ -152,7 +159,7 @@ export default function InfraMonitoringK8s(): JSX.Element {
children: ( children: (
<QuickFilters <QuickFilters
source={QuickFiltersSource.INFRA_MONITORING} source={QuickFiltersSource.INFRA_MONITORING}
config={NamespaceQuickFiltersConfig} config={GetNamespaceQuickFiltersConfig(dotMetricsEnabled)}
handleFilterVisibilityChange={handleFilterVisibilityChange} handleFilterVisibilityChange={handleFilterVisibilityChange}
onFilterChange={handleFilterChange} onFilterChange={handleFilterChange}
/> />
@ -172,7 +179,7 @@ export default function InfraMonitoringK8s(): JSX.Element {
children: ( children: (
<QuickFilters <QuickFilters
source={QuickFiltersSource.INFRA_MONITORING} source={QuickFiltersSource.INFRA_MONITORING}
config={ClustersQuickFiltersConfig} config={GetClustersQuickFiltersConfig(dotMetricsEnabled)}
handleFilterVisibilityChange={handleFilterVisibilityChange} handleFilterVisibilityChange={handleFilterVisibilityChange}
onFilterChange={handleFilterChange} onFilterChange={handleFilterChange}
/> />
@ -192,7 +199,7 @@ export default function InfraMonitoringK8s(): JSX.Element {
children: ( children: (
<QuickFilters <QuickFilters
source={QuickFiltersSource.INFRA_MONITORING} source={QuickFiltersSource.INFRA_MONITORING}
config={DeploymentsQuickFiltersConfig} config={GetDeploymentsQuickFiltersConfig(dotMetricsEnabled)}
handleFilterVisibilityChange={handleFilterVisibilityChange} handleFilterVisibilityChange={handleFilterVisibilityChange}
onFilterChange={handleFilterChange} onFilterChange={handleFilterChange}
/> />
@ -212,7 +219,7 @@ export default function InfraMonitoringK8s(): JSX.Element {
children: ( children: (
<QuickFilters <QuickFilters
source={QuickFiltersSource.INFRA_MONITORING} source={QuickFiltersSource.INFRA_MONITORING}
config={JobsQuickFiltersConfig} config={GetJobsQuickFiltersConfig(dotMetricsEnabled)}
handleFilterVisibilityChange={handleFilterVisibilityChange} handleFilterVisibilityChange={handleFilterVisibilityChange}
onFilterChange={handleFilterChange} onFilterChange={handleFilterChange}
/> />
@ -232,7 +239,7 @@ export default function InfraMonitoringK8s(): JSX.Element {
children: ( children: (
<QuickFilters <QuickFilters
source={QuickFiltersSource.INFRA_MONITORING} source={QuickFiltersSource.INFRA_MONITORING}
config={DaemonSetsQuickFiltersConfig} config={GetDaemonsetsQuickFiltersConfig(dotMetricsEnabled)}
handleFilterVisibilityChange={handleFilterVisibilityChange} handleFilterVisibilityChange={handleFilterVisibilityChange}
onFilterChange={handleFilterChange} onFilterChange={handleFilterChange}
/> />
@ -255,7 +262,7 @@ export default function InfraMonitoringK8s(): JSX.Element {
children: ( children: (
<QuickFilters <QuickFilters
source={QuickFiltersSource.INFRA_MONITORING} source={QuickFiltersSource.INFRA_MONITORING}
config={StatefulsetsQuickFiltersConfig} config={GetStatefulsetsQuickFiltersConfig(dotMetricsEnabled)}
handleFilterVisibilityChange={handleFilterVisibilityChange} handleFilterVisibilityChange={handleFilterVisibilityChange}
onFilterChange={handleFilterChange} onFilterChange={handleFilterChange}
/> />
@ -275,7 +282,7 @@ export default function InfraMonitoringK8s(): JSX.Element {
children: ( children: (
<QuickFilters <QuickFilters
source={QuickFiltersSource.INFRA_MONITORING} source={QuickFiltersSource.INFRA_MONITORING}
config={VolumesQuickFiltersConfig} config={GetVolumesQuickFiltersConfig(dotMetricsEnabled)}
handleFilterVisibilityChange={handleFilterVisibilityChange} handleFilterVisibilityChange={handleFilterVisibilityChange}
onFilterChange={handleFilterChange} onFilterChange={handleFilterChange}
/> />

View File

@ -30,7 +30,26 @@ export const getJobMetricsQueryPayload = (
job: K8sJobsData, job: K8sJobsData,
start: number, start: number,
end: number, end: number,
): GetQueryResultsProps[] => [ dotMetricsEnabled: boolean,
): GetQueryResultsProps[] => {
const k8sPodCpuUtilizationKey = dotMetricsEnabled
? 'k8s.pod.cpu.utilization'
: 'k8s_pod_cpu_utilization';
const k8sPodMemoryUsageKey = dotMetricsEnabled
? 'k8s.pod.memory.usage'
: 'k8s_pod_memory_usage';
const k8sPodNetworkIoKey = dotMetricsEnabled
? 'k8s.pod.network.io'
: 'k8s_pod_network_io';
const k8sPodNetworkErrorsKey = dotMetricsEnabled
? 'k8s.pod.network.errors'
: 'k8s_pod_network_errors';
const k8sJobNameKey = dotMetricsEnabled ? 'k8s.job.name' : 'k8s_job_name';
const k8sNamespaceNameKey = dotMetricsEnabled
? 'k8s.namespace.name'
: 'k8s_namespace_name';
return [
{ {
selectedTime: 'GLOBAL_TIME', selectedTime: 'GLOBAL_TIME',
graphType: PANEL_TYPES.TIME_SERIES, graphType: PANEL_TYPES.TIME_SERIES,
@ -43,7 +62,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_pod_cpu_utilization--float64--Gauge--true', id: 'k8s_pod_cpu_utilization--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_cpu_utilization', key: k8sPodCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -59,7 +78,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_job_name--string--tag--false', id: 'k8s_job_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_job_name', key: k8sJobNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -72,7 +91,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -132,7 +151,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_pod_memory_usage--float64--Gauge--true', id: 'k8s_pod_memory_usage--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_usage', key: k8sPodMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -148,7 +167,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_job_name--string--tag--false', id: 'k8s_job_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_job_name', key: k8sJobNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -161,7 +180,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -221,7 +240,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_pod_network_io--float64--Sum--true', id: 'k8s_pod_network_io--float64--Sum--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_network_io', key: k8sPodNetworkIoKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'rate', aggregateOperator: 'rate',
@ -237,7 +256,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_job_name--string--tag--false', id: 'k8s_job_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_job_name', key: k8sJobNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -250,7 +269,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -327,7 +346,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_pod_network_errors--float64--Sum--true', id: 'k8s_pod_network_errors--float64--Sum--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_network_errors', key: k8sPodNetworkErrorsKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'increase', aggregateOperator: 'increase',
@ -343,7 +362,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_job_name--string--tag--false', id: 'k8s_job_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_job_name', key: k8sJobNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -356,7 +375,7 @@ export const getJobMetricsQueryPayload = (
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -422,3 +441,4 @@ export const getJobMetricsQueryPayload = (
end, end,
}, },
]; ];
};

View File

@ -29,11 +29,13 @@ import { AppState } from 'store/reducers';
import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { getOrderByFromParams } from '../commonUtils'; import { getOrderByFromParams } from '../commonUtils';
import { import {
GetK8sEntityToAggregateAttribute,
INFRA_MONITORING_K8S_PARAMS_KEYS, INFRA_MONITORING_K8S_PARAMS_KEYS,
K8sCategory, K8sCategory,
K8sEntityToAggregateAttributeMapping,
} from '../constants'; } from '../constants';
import K8sHeader from '../K8sHeader'; import K8sHeader from '../K8sHeader';
import LoadingContainer from '../LoadingContainer'; import LoadingContainer from '../LoadingContainer';
@ -132,6 +134,11 @@ function K8sJobsList({
} }
}, [quickFiltersLastUpdated]); }, [quickFiltersLastUpdated]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const createFiltersForSelectedRowData = ( const createFiltersForSelectedRowData = (
selectedRowData: K8sJobsRowData, selectedRowData: K8sJobsRowData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -185,10 +192,15 @@ function K8sJobsList({
isLoading: isLoadingGroupedByRowData, isLoading: isLoadingGroupedByRowData,
isError: isErrorGroupedByRowData, isError: isErrorGroupedByRowData,
refetch: fetchGroupedByRowData, refetch: fetchGroupedByRowData,
} = useGetK8sJobsList(fetchGroupedByRowDataQuery as K8sJobsListPayload, { } = useGetK8sJobsList(
fetchGroupedByRowDataQuery as K8sJobsListPayload,
{
queryKey: ['jobList', fetchGroupedByRowDataQuery], queryKey: ['jobList', fetchGroupedByRowDataQuery],
enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData, enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData,
}); },
undefined,
dotMetricsEnabled,
);
const { const {
data: groupByFiltersData, data: groupByFiltersData,
@ -196,7 +208,10 @@ function K8sJobsList({
} = useGetAggregateKeys( } = useGetAggregateKeys(
{ {
dataSource: currentQuery.builder.queryData[0].dataSource, dataSource: currentQuery.builder.queryData[0].dataSource,
aggregateAttribute: K8sEntityToAggregateAttributeMapping[K8sCategory.JOBS], aggregateAttribute: GetK8sEntityToAggregateAttribute(
K8sCategory.JOBS,
dotMetricsEnabled,
),
aggregateOperator: 'noop', aggregateOperator: 'noop',
searchText: '', searchText: '',
tagType: '', tagType: '',
@ -242,6 +257,8 @@ function K8sJobsList({
queryKey: ['jobList', query], queryKey: ['jobList', query],
enabled: !!query, enabled: !!query,
}, },
undefined,
dotMetricsEnabled,
); );
const jobsData = useMemo(() => data?.payload?.data?.records || [], [data]); const jobsData = useMemo(() => data?.payload?.data?.records || [], [data]);

View File

@ -263,6 +263,12 @@ export const getK8sJobsListColumns = (
return columnsConfig as ColumnType<K8sJobsRowData>[]; return columnsConfig as ColumnType<K8sJobsRowData>[];
}; };
const dotToUnder: Record<string, keyof K8sJobsData['meta']> = {
'k8s.job.name': 'k8s_job_name',
'k8s.namespace.name': 'k8s_namespace_name',
'k8s.cluster.name': 'k8s_cluster_name',
};
const getGroupByEle = ( const getGroupByEle = (
job: K8sJobsData, job: K8sJobsData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -270,7 +276,13 @@ const getGroupByEle = (
const groupByValues: string[] = []; const groupByValues: string[] = [];
groupBy.forEach((group) => { groupBy.forEach((group) => {
groupByValues.push(job.meta[group.key as keyof typeof job.meta]); const rawKey = group.key as string;
// Choose mapped key if present, otherwise use rawKey
const metaKey = (dotToUnder[rawKey] ?? rawKey) as keyof typeof job.meta;
const value = job.meta[metaKey];
groupByValues.push(value);
}); });
return ( return (

View File

@ -28,11 +28,13 @@ import { AppState } from 'store/reducers';
import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { getOrderByFromParams } from '../commonUtils'; import { getOrderByFromParams } from '../commonUtils';
import { import {
GetK8sEntityToAggregateAttribute,
INFRA_MONITORING_K8S_PARAMS_KEYS, INFRA_MONITORING_K8S_PARAMS_KEYS,
K8sCategory, K8sCategory,
K8sEntityToAggregateAttributeMapping,
} from '../constants'; } from '../constants';
import K8sHeader from '../K8sHeader'; import K8sHeader from '../K8sHeader';
import LoadingContainer from '../LoadingContainer'; import LoadingContainer from '../LoadingContainer';
@ -136,6 +138,11 @@ function K8sNamespacesList({
} }
}, [quickFiltersLastUpdated]); }, [quickFiltersLastUpdated]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const createFiltersForSelectedRowData = ( const createFiltersForSelectedRowData = (
selectedRowData: K8sNamespacesRowData, selectedRowData: K8sNamespacesRowData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -195,6 +202,8 @@ function K8sNamespacesList({
queryKey: ['namespaceList', fetchGroupedByRowDataQuery], queryKey: ['namespaceList', fetchGroupedByRowDataQuery],
enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData, enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData,
}, },
undefined,
dotMetricsEnabled,
); );
const { const {
@ -203,8 +212,10 @@ function K8sNamespacesList({
} = useGetAggregateKeys( } = useGetAggregateKeys(
{ {
dataSource: currentQuery.builder.queryData[0].dataSource, dataSource: currentQuery.builder.queryData[0].dataSource,
aggregateAttribute: aggregateAttribute: GetK8sEntityToAggregateAttribute(
K8sEntityToAggregateAttributeMapping[K8sCategory.NAMESPACES], K8sCategory.NAMESPACES,
dotMetricsEnabled,
),
aggregateOperator: 'noop', aggregateOperator: 'noop',
searchText: '', searchText: '',
tagType: '', tagType: '',
@ -245,6 +256,8 @@ function K8sNamespacesList({
queryKey: ['namespaceList', query], queryKey: ['namespaceList', query],
enabled: !!query, enabled: !!query,
}, },
undefined,
dotMetricsEnabled,
); );
const namespacesData = useMemo(() => data?.payload?.data?.records || [], [ const namespacesData = useMemo(() => data?.payload?.data?.records || [], [

View File

@ -54,7 +54,97 @@ export const getNamespaceMetricsQueryPayload = (
namespace: K8sNamespacesData, namespace: K8sNamespacesData,
start: number, start: number,
end: number, end: number,
): GetQueryResultsProps[] => [ dotMetricsEnabled: boolean,
): GetQueryResultsProps[] => {
const getKey = (dotKey: string, underscoreKey: string): string =>
dotMetricsEnabled ? dotKey : underscoreKey;
const k8sPodCpuUtilizationKey = getKey(
'k8s.pod.cpu.utilization',
'k8s_pod_cpu_utilization',
);
const k8sContainerCpuRequestKey = getKey(
'k8s.container.cpu_request',
'k8s_container_cpu_request',
);
const k8sPodMemoryUsageKey = getKey(
'k8s.pod.memory.usage',
'k8s_pod_memory_usage',
);
const k8sContainerMemoryRequestKey = getKey(
'k8s.container.memory_request',
'k8s_container_memory_request',
);
const k8sPodMemoryWorkingSetKey = getKey(
'k8s.pod.memory.working_set',
'k8s_pod_memory_working_set',
);
const k8sPodMemoryRssKey = getKey('k8s.pod.memory.rss', 'k8s_pod_memory_rss');
const k8sPodNetworkIoKey = getKey('k8s.pod.network.io', 'k8s_pod_network_io');
const k8sPodNetworkErrorsKey = getKey(
'k8s.pod.network.errors',
'k8s_pod_network_errors',
);
const k8sStatefulsetCurrentPodsKey = getKey(
'k8s.statefulset.current_pods',
'k8s_statefulset_current_pods',
);
const k8sStatefulsetDesiredPodsKey = getKey(
'k8s.statefulset.desired_pods',
'k8s_statefulset_desired_pods',
);
const k8sStatefulsetUpdatedPodsKey = getKey(
'k8s.statefulset.updated_pods',
'k8s_statefulset_updated_pods',
);
const k8sReplicasetDesiredKey = getKey(
'k8s.replicaset.desired',
'k8s_replicaset_desired',
);
const k8sReplicasetAvailableKey = getKey(
'k8s.replicaset.available',
'k8s_replicaset_available',
);
const k8sDaemonsetDesiredScheduledNamespacesKey = getKey(
'k8s.daemonset.desired.scheduled.namespaces',
'k8s_daemonset_desired_scheduled_namespaces',
);
const k8sDaemonsetCurrentScheduledNamespacesKey = getKey(
'k8s.daemonset.current.scheduled.namespaces',
'k8s_daemonset_current_scheduled_namespaces',
);
const k8sDaemonsetReadyNamespacesKey = getKey(
'k8s.daemonset.ready.namespaces',
'k8s_daemonset_ready_namespaces',
);
const k8sDaemonsetMisscheduledNamespacesKey = getKey(
'k8s.daemonset.misscheduled.namespaces',
'k8s_daemonset_misscheduled_namespaces',
);
const k8sDeploymentDesiredKey = getKey(
'k8s.deployment.desired',
'k8s_deployment_desired',
);
const k8sDeploymentAvailableKey = getKey(
'k8s.deployment.available',
'k8s_deployment_available',
);
const k8sNamespaceNameKey = getKey('k8s.namespace.name', 'k8s_namespace_name');
const k8sPodNameKey = getKey('k8s.pod.name', 'k8s_pod_name');
const k8sStatefulsetNameKey = getKey(
'k8s.statefulset.name',
'k8s_statefulset_name',
);
const k8sReplicasetNameKey = getKey(
'k8s.replicaset.name',
'k8s_replicaset_name',
);
const k8sDaemonsetNameKey = getKey('k8s.daemonset.name', 'k8s_daemonset_name');
const k8sDeploymentNameKey = getKey(
'k8s.deployment.name',
'k8s_deployment_name',
);
return [
{ {
selectedTime: 'GLOBAL_TIME', selectedTime: 'GLOBAL_TIME',
graphType: PANEL_TYPES.TIME_SERIES, graphType: PANEL_TYPES.TIME_SERIES,
@ -64,10 +154,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_cpu_utilization--float64--Gauge--true', id: k8sPodCpuUtilizationKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_cpu_utilization', key: k8sPodCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -80,10 +170,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '47b3adae', id: '47b3adae',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -107,10 +197,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_container_cpu_request--float64--Gauge--true', id: k8sContainerCpuRequestKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_cpu_request', key: k8sContainerCpuRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -123,10 +213,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '93d2be5e', id: '93d2be5e',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -150,10 +240,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_cpu_utilization--float64--Gauge--true', id: k8sPodCpuUtilizationKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_cpu_utilization', key: k8sPodCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'min', aggregateOperator: 'min',
@ -166,10 +256,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '795eb679', id: '795eb679',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -193,10 +283,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_cpu_utilization--float64--Gauge--true', id: k8sPodCpuUtilizationKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_cpu_utilization', key: k8sPodCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'max', aggregateOperator: 'max',
@ -209,10 +299,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '6792adbe', id: '6792adbe',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -269,10 +359,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_memory_usage--float64--Gauge--true', id: k8sPodMemoryUsageKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_usage', key: k8sPodMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -285,10 +375,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '10011298', id: '10011298',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -312,10 +402,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_container_memory_request--float64--Gauge--true', id: k8sContainerMemoryRequestKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_memory_request', key: k8sContainerMemoryRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -328,10 +418,10 @@ export const getNamespaceMetricsQueryPayload = (
id: 'ea53b656', id: 'ea53b656',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -355,10 +445,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_memory_working_set--float64--Gauge--true', id: k8sPodMemoryWorkingSetKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_working_set', key: k8sPodMemoryWorkingSetKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -371,10 +461,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '674ace83', id: '674ace83',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -398,10 +488,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_memory_rss--float64--Gauge--true', id: k8sPodMemoryRssKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_rss', key: k8sPodMemoryRssKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -414,10 +504,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '187dbdb3', id: '187dbdb3',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -441,10 +531,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_memory_usage--float64--Gauge--true', id: k8sPodMemoryUsageKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_usage', key: k8sPodMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'min', aggregateOperator: 'min',
@ -457,10 +547,10 @@ export const getNamespaceMetricsQueryPayload = (
id: 'a3dbf468', id: 'a3dbf468',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -484,10 +574,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_memory_usage--float64--Gauge--true', id: k8sPodMemoryUsageKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_usage', key: k8sPodMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'max', aggregateOperator: 'max',
@ -500,10 +590,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '4b2406c2', id: '4b2406c2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -560,10 +650,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_cpu_utilization--float64--Gauge--true', id: k8sPodCpuUtilizationKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_cpu_utilization', key: k8sPodCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -576,10 +666,10 @@ export const getNamespaceMetricsQueryPayload = (
id: 'c3a73f0a', id: 'c3a73f0a',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -592,15 +682,15 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_pod_name--string--tag--false', id: k8sPodNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
], ],
having: [], having: [],
legend: '{{k8s_pod_name}}', legend: `{{${k8sPodNameKey}}}`,
limit: 20, limit: 20,
orderBy: [], orderBy: [],
queryName: 'A', queryName: 'A',
@ -645,10 +735,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_memory_usage--float64--Gauge--true', id: k8sPodMemoryUsageKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_usage', key: k8sPodMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -661,10 +751,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '5cad3379', id: '5cad3379',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -677,15 +767,15 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_pod_name--string--tag--false', id: k8sPodNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
], ],
having: [], having: [],
legend: '{{k8s_pod_name}}', legend: `{{${k8sPodNameKey}}}`,
limit: 10, limit: 10,
orderBy: [], orderBy: [],
queryName: 'A', queryName: 'A',
@ -730,10 +820,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_network_io--float64--Sum--true', id: k8sPodNetworkIoKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_network_io', key: k8sPodNetworkIoKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'rate', aggregateOperator: 'rate',
@ -746,10 +836,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '00f5c5e1', id: '00f5c5e1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -762,7 +852,7 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'interface--string--tag--false', id: 'interface',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'interface', key: 'interface',
@ -770,7 +860,7 @@ export const getNamespaceMetricsQueryPayload = (
}, },
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'direction--string--tag--false', id: 'direction',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'direction', key: 'direction',
@ -823,10 +913,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_pod_network_errors--float64--Sum--true', id: k8sPodNetworkErrorsKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_network_errors', key: k8sPodNetworkErrorsKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'increase', aggregateOperator: 'increase',
@ -839,10 +929,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '3aa8e064', id: '3aa8e064',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -855,7 +945,7 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'interface--string--tag--false', id: 'interface',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'interface', key: 'interface',
@ -863,7 +953,7 @@ export const getNamespaceMetricsQueryPayload = (
}, },
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'direction--string--tag--false', id: 'direction',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'direction', key: 'direction',
@ -916,10 +1006,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_statefulset_current_pods--float64--Gauge--true', id: k8sStatefulsetCurrentPodsKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_current_pods', key: k8sStatefulsetCurrentPodsKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -932,10 +1022,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '5f2a55c5', id: '5f2a55c5',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sStatefulsetNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sStatefulsetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -948,10 +1038,10 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_statefulset_name--string--tag--false', id: k8sStatefulsetNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_name', key: k8sStatefulsetNameKey,
type: 'tag', type: 'tag',
}, },
], ],
@ -968,10 +1058,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_statefulset_desired_pods--float64--Gauge--true', id: k8sStatefulsetDesiredPodsKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_desired_pods', key: k8sStatefulsetDesiredPodsKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -984,10 +1074,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '13bd7a1d', id: '13bd7a1d',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1000,10 +1090,10 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_statefulset_name--string--tag--false', id: k8sStatefulsetNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_name', key: k8sStatefulsetNameKey,
type: 'tag', type: 'tag',
}, },
], ],
@ -1020,10 +1110,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_statefulset_updated_pods--float64--Gauge--true', id: k8sStatefulsetUpdatedPodsKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_updated_pods', key: k8sStatefulsetUpdatedPodsKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -1036,10 +1126,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '9d287c73', id: '9d287c73',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1052,10 +1142,10 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_statefulset_name--string--tag--false', id: k8sStatefulsetNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_name', key: k8sStatefulsetNameKey,
type: 'tag', type: 'tag',
}, },
], ],
@ -1105,10 +1195,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_replicaset_desired--float64--Gauge--true', id: k8sReplicasetDesiredKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_replicaset_desired', key: k8sReplicasetDesiredKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -1121,10 +1211,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '0c1e655c', id: '0c1e655c',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1137,16 +1227,16 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_replicaset_name--string--tag--false', id: k8sReplicasetNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_replicaset_name', key: k8sReplicasetNameKey,
type: 'tag', type: 'tag',
}, },
], ],
having: [ having: [
{ {
columnName: 'MAX(k8s_replicaset_desired)', columnName: `MAX(${k8sReplicasetDesiredKey})`,
op: '>', op: '>',
value: 0, value: 0,
}, },
@ -1163,10 +1253,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_replicaset_available--float64--Gauge--true', id: k8sReplicasetAvailableKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_replicaset_available', key: k8sReplicasetAvailableKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -1179,10 +1269,10 @@ export const getNamespaceMetricsQueryPayload = (
id: 'b2296bdb', id: 'b2296bdb',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1195,16 +1285,16 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_replicaset_name--string--tag--false', id: k8sReplicasetNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_replicaset_name', key: k8sReplicasetNameKey,
type: 'tag', type: 'tag',
}, },
], ],
having: [ having: [
{ {
columnName: 'MAX(k8s_replicaset_available)', columnName: `MAX(${k8sReplicasetDesiredKey})`,
op: '>', op: '>',
value: 0, value: 0,
}, },
@ -1254,10 +1344,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_daemonset_desired_scheduled_namespaces--float64--Gauge--true', id: k8sDaemonsetDesiredScheduledNamespacesKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_desired_scheduled_namespaces', key: k8sDaemonsetDesiredScheduledNamespacesKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -1270,10 +1360,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '2964eb92', id: '2964eb92',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1286,10 +1376,10 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_daemonset_name--string--tag--false', id: k8sDaemonsetNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_name', key: k8sDaemonsetNameKey,
type: 'tag', type: 'tag',
}, },
], ],
@ -1306,10 +1396,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_daemonset_current_scheduled_namespaces--float64--Gauge--true', id: k8sDaemonsetCurrentScheduledNamespacesKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_current_scheduled_namespaces', key: k8sDaemonsetCurrentScheduledNamespacesKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -1322,10 +1412,10 @@ export const getNamespaceMetricsQueryPayload = (
id: 'cd324eff', id: 'cd324eff',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1338,10 +1428,10 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_daemonset_name--string--tag--false', id: k8sDaemonsetNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_name', key: k8sDaemonsetNameKey,
type: 'tag', type: 'tag',
}, },
], ],
@ -1358,10 +1448,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_daemonset_ready_namespaces--float64--Gauge--true', id: k8sDaemonsetReadyNamespacesKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_ready_namespaces', key: k8sDaemonsetReadyNamespacesKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -1374,10 +1464,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '0416fa6f', id: '0416fa6f',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1390,10 +1480,10 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_daemonset_name--string--tag--false', id: k8sDaemonsetNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_name', key: k8sDaemonsetNameKey,
type: 'tag', type: 'tag',
}, },
], ],
@ -1410,10 +1500,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_daemonset_misscheduled_namespaces--float64--Gauge--true', id: k8sDaemonsetMisscheduledNamespacesKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_misscheduled_namespaces', key: k8sDaemonsetMisscheduledNamespacesKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -1426,10 +1516,10 @@ export const getNamespaceMetricsQueryPayload = (
id: 'c0a126d3', id: 'c0a126d3',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1442,10 +1532,10 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_daemonset_name--string--tag--false', id: k8sDaemonsetNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_daemonset_name', key: k8sDaemonsetNameKey,
type: 'tag', type: 'tag',
}, },
], ],
@ -1495,10 +1585,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_deployment_desired--float64--Gauge--true', id: k8sDeploymentDesiredKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_deployment_desired', key: k8sDeploymentDesiredKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -1511,10 +1601,10 @@ export const getNamespaceMetricsQueryPayload = (
id: '9bc659c1', id: '9bc659c1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1527,10 +1617,10 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_deployment_name--string--tag--false', id: k8sDeploymentNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_deployment_name', key: k8sDeploymentNameKey,
type: 'tag', type: 'tag',
}, },
], ],
@ -1547,10 +1637,10 @@ export const getNamespaceMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_deployment_available--float64--Gauge--true', id: k8sDeploymentAvailableKey,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_deployment_available', key: k8sDeploymentAvailableKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -1563,10 +1653,10 @@ export const getNamespaceMetricsQueryPayload = (
id: 'e1696631', id: 'e1696631',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: k8sNamespaceNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1579,10 +1669,10 @@ export const getNamespaceMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_deployment_name--string--tag--false', id: k8sDeploymentNameKey,
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_deployment_name', key: k8sDeploymentNameKey,
type: 'tag', type: 'tag',
}, },
], ],
@ -1631,3 +1721,4 @@ export const getNamespaceMetricsQueryPayload = (
end, end,
}, },
]; ];
};

View File

@ -122,6 +122,11 @@ export const getK8sNamespacesListColumns = (
return columnsConfig as ColumnType<K8sNamespacesRowData>[]; return columnsConfig as ColumnType<K8sNamespacesRowData>[];
}; };
const dotToUnder: Record<string, keyof K8sNamespacesData['meta']> = {
'k8s.namespace.name': 'k8s_namespace_name',
'k8s.cluster.name': 'k8s_cluster_name',
};
const getGroupByEle = ( const getGroupByEle = (
namespace: K8sNamespacesData, namespace: K8sNamespacesData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -129,7 +134,13 @@ const getGroupByEle = (
const groupByValues: string[] = []; const groupByValues: string[] = [];
groupBy.forEach((group) => { groupBy.forEach((group) => {
groupByValues.push(namespace.meta[group.key as keyof typeof namespace.meta]); const rawKey = group.key as string;
// Choose mapped key if present, otherwise use rawKey
const metaKey = (dotToUnder[rawKey] ?? rawKey) as keyof typeof namespace.meta;
const value = namespace.meta[metaKey];
groupByValues.push(value);
}); });
return ( return (

View File

@ -28,11 +28,13 @@ import { AppState } from 'store/reducers';
import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { getOrderByFromParams } from '../commonUtils'; import { getOrderByFromParams } from '../commonUtils';
import { import {
GetK8sEntityToAggregateAttribute,
INFRA_MONITORING_K8S_PARAMS_KEYS, INFRA_MONITORING_K8S_PARAMS_KEYS,
K8sCategory, K8sCategory,
K8sEntityToAggregateAttributeMapping,
} from '../constants'; } from '../constants';
import K8sHeader from '../K8sHeader'; import K8sHeader from '../K8sHeader';
import LoadingContainer from '../LoadingContainer'; import LoadingContainer from '../LoadingContainer';
@ -130,6 +132,11 @@ function K8sNodesList({
} }
}, [quickFiltersLastUpdated]); }, [quickFiltersLastUpdated]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const createFiltersForSelectedRowData = ( const createFiltersForSelectedRowData = (
selectedRowData: K8sNodesRowData, selectedRowData: K8sNodesRowData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -183,10 +190,15 @@ function K8sNodesList({
isLoading: isLoadingGroupedByRowData, isLoading: isLoadingGroupedByRowData,
isError: isErrorGroupedByRowData, isError: isErrorGroupedByRowData,
refetch: fetchGroupedByRowData, refetch: fetchGroupedByRowData,
} = useGetK8sNodesList(fetchGroupedByRowDataQuery as K8sNodesListPayload, { } = useGetK8sNodesList(
fetchGroupedByRowDataQuery as K8sNodesListPayload,
{
queryKey: ['nodeList', fetchGroupedByRowDataQuery], queryKey: ['nodeList', fetchGroupedByRowDataQuery],
enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData, enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData,
}); },
undefined,
dotMetricsEnabled,
);
const { const {
data: groupByFiltersData, data: groupByFiltersData,
@ -194,7 +206,10 @@ function K8sNodesList({
} = useGetAggregateKeys( } = useGetAggregateKeys(
{ {
dataSource: currentQuery.builder.queryData[0].dataSource, dataSource: currentQuery.builder.queryData[0].dataSource,
aggregateAttribute: K8sEntityToAggregateAttributeMapping[K8sCategory.NODES], aggregateAttribute: GetK8sEntityToAggregateAttribute(
K8sCategory.NODES,
dotMetricsEnabled,
),
aggregateOperator: 'noop', aggregateOperator: 'noop',
searchText: '', searchText: '',
tagType: '', tagType: '',
@ -240,6 +255,8 @@ function K8sNodesList({
queryKey: ['nodeList', query], queryKey: ['nodeList', query],
enabled: !!query, enabled: !!query,
}, },
undefined,
dotMetricsEnabled,
); );
const nodesData = useMemo(() => data?.payload?.data?.records || [], [data]); const nodesData = useMemo(() => data?.payload?.data?.records || [], [data]);

View File

@ -54,7 +54,90 @@ export const getNodeMetricsQueryPayload = (
node: K8sNodesData, node: K8sNodesData,
start: number, start: number,
end: number, end: number,
): GetQueryResultsProps[] => [ dotMetricsEnabled: boolean,
): GetQueryResultsProps[] => {
const getKey = (dotKey: string, underscoreKey: string): string =>
dotMetricsEnabled ? dotKey : underscoreKey;
const k8sNodeCpuUtilizationKey = getKey(
'k8s.node.cpu.utilization',
'k8s_node_cpu_utilization',
);
const k8sNodeAllocatableCpuKey = getKey(
'k8s.node.allocatable_cpu',
'k8s_node_allocatable_cpu',
);
const k8sContainerCpuRequestKey = getKey(
'k8s.container.cpu_request',
'k8s_container_cpu_request',
);
const k8sNodeMemoryUsageKey = getKey(
'k8s.node.memory.usage',
'k8s_node_memory_usage',
);
const k8sNodeAllocatableMemoryKey = getKey(
'k8s.node.allocatable_memory',
'k8s_node_allocatable_memory',
);
const k8sContainerMemoryRequestKey = getKey(
'k8s.container.memory_request',
'k8s_container_memory_request',
);
const k8sNodeMemoryWorkingSetKey = getKey(
'k8s.node.memory.working_set',
'k8s_node_memory_working_set',
);
const k8sNodeMemoryRssKey = getKey(
'k8s.node.memory.rss',
'k8s_node_memory_rss',
);
const k8sPodCpuUtilizationKey = getKey(
'k8s.pod.cpu.utilization',
'k8s_pod_cpu_utilization',
);
const k8sPodMemoryUsageKey = getKey(
'k8s.pod.memory.usage',
'k8s_pod_memory_usage',
);
const k8sNodeNetworkErrorsKey = getKey(
'k8s.node.network.errors',
'k8s_node_network_errors',
);
const k8sNodeNetworkIoKey = getKey(
'k8s.node.network.io',
'k8s_node_network_io',
);
const k8sNodeFilesystemUsageKey = getKey(
'k8s.node.filesystem.usage',
'k8s_node_filesystem_usage',
);
const k8sNodeFilesystemCapacityKey = getKey(
'k8s.node.filesystem.capacity',
'k8s_node_filesystem_capacity',
);
const k8sNodeFilesystemAvailableKey = getKey(
'k8s.node.filesystem.available',
'k8s_node_filesystem_available',
);
const k8sNodeNameKey = getKey('k8s.node.name', 'k8s_node_name');
const k8sPodNameKey = getKey('k8s.pod.name', 'k8s_pod_name');
return [
{ {
selectedTime: 'GLOBAL_TIME', selectedTime: 'GLOBAL_TIME',
graphType: PANEL_TYPES.TIME_SERIES, graphType: PANEL_TYPES.TIME_SERIES,
@ -67,7 +150,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_cpu_utilization--float64--Gauge--true', id: 'k8s_node_cpu_utilization--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_cpu_utilization', key: k8sNodeCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -83,7 +166,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -110,7 +193,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_allocatable_cpu--float64--Gauge--true', id: 'k8s_node_allocatable_cpu--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_allocatable_cpu', key: k8sNodeAllocatableCpuKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -126,7 +209,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -153,7 +236,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_container_cpu_request--float64--Gauge--true', id: 'k8s_container_cpu_request--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_cpu_request', key: k8sContainerCpuRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -169,7 +252,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -196,7 +279,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_cpu_utilization--float64--Gauge--true', id: 'k8s_node_cpu_utilization--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_cpu_utilization', key: k8sNodeCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'max', aggregateOperator: 'max',
@ -212,7 +295,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -239,7 +322,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_cpu_utilization--float64--Gauge--true', id: 'k8s_node_cpu_utilization--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_cpu_utilization', key: k8sNodeCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'min', aggregateOperator: 'min',
@ -255,7 +338,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -315,7 +398,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_memory_usage--float64--Gauge--true', id: 'k8s_node_memory_usage--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_memory_usage', key: k8sNodeMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -331,7 +414,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -358,7 +441,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_allocatable_memory--float64--Gauge--true', id: 'k8s_node_allocatable_memory--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_allocatable_memory', key: k8sNodeAllocatableMemoryKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -374,7 +457,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -401,7 +484,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_container_memory_request--float64--Gauge--true', id: 'k8s_container_memory_request--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_memory_request', key: k8sContainerMemoryRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -417,7 +500,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -444,7 +527,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_memory_usage--float64--Gauge--true', id: 'k8s_node_memory_usage--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_memory_usage', key: k8sNodeMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'max', aggregateOperator: 'max',
@ -460,7 +543,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -487,7 +570,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_memory_usage--float64--Gauge--true', id: 'k8s_node_memory_usage--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_memory_usage', key: k8sNodeMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'min', aggregateOperator: 'min',
@ -503,7 +586,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -530,7 +613,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_memory_working_set--float64--Gauge--true', id: 'k8s_node_memory_working_set--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_memory_working_set', key: k8sNodeMemoryWorkingSetKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -546,7 +629,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -573,7 +656,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_memory_rss--float64--Gauge--true', id: 'k8s_node_memory_rss--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_memory_rss', key: k8sNodeMemoryRssKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -589,7 +672,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -649,7 +732,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_cpu_utilization--float64--Gauge--true', id: 'k8s_node_cpu_utilization--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_cpu_utilization', key: k8sNodeCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -665,7 +748,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -692,7 +775,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_allocatable_cpu--float64--Gauge--true', id: 'k8s_node_allocatable_cpu--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_allocatable_cpu', key: k8sNodeAllocatableCpuKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -708,7 +791,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -735,7 +818,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_container_cpu_request--float64--Gauge--true', id: 'k8s_container_cpu_request--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_cpu_request', key: k8sContainerCpuRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -751,7 +834,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -824,7 +907,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_memory_usage--float64--Gauge--true', id: 'k8s_node_memory_usage--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_memory_usage', key: k8sNodeMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -840,7 +923,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -867,7 +950,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_allocatable_memory--float64--Gauge--true', id: 'k8s_node_allocatable_memory--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_allocatable_memory', key: k8sNodeAllocatableMemoryKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -883,7 +966,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -910,7 +993,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_container_memory_request--float64--Gauge--true', id: 'k8s_container_memory_request--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_memory_request', key: k8sContainerMemoryRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -926,7 +1009,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -999,7 +1082,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_pod_cpu_utilization--float64--Gauge--true', id: 'k8s_pod_cpu_utilization--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_cpu_utilization', key: k8sPodCpuUtilizationKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -1015,7 +1098,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1031,12 +1114,12 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_pod_name--string--tag--false', id: 'k8s_pod_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
], ],
having: [], having: [],
legend: '{{k8s_pod_name}}', legend: `{{${k8sPodNameKey}}}`,
limit: 10, limit: 10,
orderBy: [], orderBy: [],
queryName: 'A', queryName: 'A',
@ -1084,7 +1167,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_pod_memory_usage--float64--Gauge--true', id: 'k8s_pod_memory_usage--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_usage', key: k8sPodMemoryUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -1100,7 +1183,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1116,12 +1199,12 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_pod_name--string--tag--false', id: 'k8s_pod_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
], ],
having: [], having: [],
legend: '{{k8s_pod_name}}', legend: `{{${k8sPodNameKey}}}`,
limit: 10, limit: 10,
orderBy: [], orderBy: [],
queryName: 'A', queryName: 'A',
@ -1169,7 +1252,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_network_errors--float64--Sum--true', id: 'k8s_node_network_errors--float64--Sum--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_network_errors', key: k8sNodeNetworkErrorsKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'increase', aggregateOperator: 'increase',
@ -1185,7 +1268,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1262,7 +1345,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_network_io--float64--Sum--true', id: 'k8s_node_network_io--float64--Sum--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_network_io', key: k8sNodeNetworkIoKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'rate', aggregateOperator: 'rate',
@ -1278,7 +1361,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1355,7 +1438,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_filesystem_usage--float64--Gauge--true', id: 'k8s_node_filesystem_usage--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_filesystem_usage', key: k8sNodeFilesystemUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -1371,7 +1454,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1398,7 +1481,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_filesystem_capacity--float64--Gauge--true', id: 'k8s_node_filesystem_capacity--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_filesystem_capacity', key: k8sNodeFilesystemCapacityKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -1414,7 +1497,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1441,7 +1524,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_filesystem_available--float64--Gauge--true', id: 'k8s_node_filesystem_available--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_filesystem_available', key: k8sNodeFilesystemAvailableKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -1457,7 +1540,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1517,7 +1600,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_filesystem_usage--float64--Gauge--true', id: 'k8s_node_filesystem_usage--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_filesystem_usage', key: k8sNodeFilesystemUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -1533,7 +1616,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1560,7 +1643,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_filesystem_capacity--float64--Gauge--true', id: 'k8s_node_filesystem_capacity--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_node_filesystem_capacity', key: k8sNodeFilesystemCapacityKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -1576,7 +1659,7 @@ export const getNodeMetricsQueryPayload = (
id: 'k8s_node_name--string--tag--false', id: 'k8s_node_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_node_name', key: k8sNodeNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -1632,3 +1715,4 @@ export const getNodeMetricsQueryPayload = (
end, end,
}, },
]; ];
};

View File

@ -152,6 +152,12 @@ export const getK8sNodesListColumns = (
return columnsConfig as ColumnType<K8sNodesRowData>[]; return columnsConfig as ColumnType<K8sNodesRowData>[];
}; };
const dotToUnder: Record<string, keyof K8sNodesData['meta']> = {
'k8s.node.name': 'k8s_node_name',
'k8s.cluster.name': 'k8s_cluster_name',
'k8s.node.uid': 'k8s_node_uid',
};
const getGroupByEle = ( const getGroupByEle = (
node: K8sNodesData, node: K8sNodesData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -159,7 +165,14 @@ const getGroupByEle = (
const groupByValues: string[] = []; const groupByValues: string[] = [];
groupBy.forEach((group) => { groupBy.forEach((group) => {
groupByValues.push(node.meta[group.key as keyof typeof node.meta]); const rawKey = group.key as string;
// Choose mapped key if present, otherwise use rawKey
const metaKey = (dotToUnder[rawKey] ?? rawKey) as keyof typeof node.meta;
const value = node.meta[metaKey];
groupByValues.push(value);
}); });
return ( return (

View File

@ -29,11 +29,13 @@ import { AppState } from 'store/reducers';
import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { getOrderByFromParams } from '../commonUtils'; import { getOrderByFromParams } from '../commonUtils';
import { import {
GetK8sEntityToAggregateAttribute,
INFRA_MONITORING_K8S_PARAMS_KEYS, INFRA_MONITORING_K8S_PARAMS_KEYS,
K8sCategory, K8sCategory,
K8sEntityToAggregateAttributeMapping,
} from '../constants'; } from '../constants';
import K8sHeader from '../K8sHeader'; import K8sHeader from '../K8sHeader';
import LoadingContainer from '../LoadingContainer'; import LoadingContainer from '../LoadingContainer';
@ -118,13 +120,21 @@ function K8sPodsList({
[currentQuery?.builder?.queryData], [currentQuery?.builder?.queryData],
); );
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const { const {
data: groupByFiltersData, data: groupByFiltersData,
isLoading: isLoadingGroupByFilters, isLoading: isLoadingGroupByFilters,
} = useGetAggregateKeys( } = useGetAggregateKeys(
{ {
dataSource: currentQuery.builder.queryData[0].dataSource, dataSource: currentQuery.builder.queryData[0].dataSource,
aggregateAttribute: K8sEntityToAggregateAttributeMapping[K8sCategory.PODS], aggregateAttribute: GetK8sEntityToAggregateAttribute(
K8sCategory.PODS,
dotMetricsEnabled,
),
aggregateOperator: 'noop', aggregateOperator: 'noop',
searchText: '', searchText: '',
tagType: '', tagType: '',
@ -201,6 +211,8 @@ function K8sPodsList({
queryKey: ['hostList', query], queryKey: ['hostList', query],
enabled: !!query, enabled: !!query,
}, },
undefined,
dotMetricsEnabled,
); );
const createFiltersForSelectedRowData = ( const createFiltersForSelectedRowData = (
@ -255,10 +267,15 @@ function K8sPodsList({
isLoading: isLoadingGroupedByRowData, isLoading: isLoadingGroupedByRowData,
isError: isErrorGroupedByRowData, isError: isErrorGroupedByRowData,
refetch: fetchGroupedByRowData, refetch: fetchGroupedByRowData,
} = useGetK8sPodsList(fetchGroupedByRowDataQuery as K8sPodsListPayload, { } = useGetK8sPodsList(
fetchGroupedByRowDataQuery as K8sPodsListPayload,
{
queryKey: ['hostList', fetchGroupedByRowDataQuery], queryKey: ['hostList', fetchGroupedByRowDataQuery],
enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData, enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData,
}); },
undefined,
dotMetricsEnabled,
);
const podsData = useMemo(() => data?.payload?.data?.records || [], [data]); const podsData = useMemo(() => data?.payload?.data?.records || [], [data]);
const totalCount = data?.payload?.data?.total || 0; const totalCount = data?.payload?.data?.total || 0;

File diff suppressed because it is too large Load Diff

View File

@ -29,11 +29,13 @@ import { AppState } from 'store/reducers';
import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { getOrderByFromParams } from '../commonUtils'; import { getOrderByFromParams } from '../commonUtils';
import { import {
GetK8sEntityToAggregateAttribute,
INFRA_MONITORING_K8S_PARAMS_KEYS, INFRA_MONITORING_K8S_PARAMS_KEYS,
K8sCategory, K8sCategory,
K8sEntityToAggregateAttributeMapping,
} from '../constants'; } from '../constants';
import K8sHeader from '../K8sHeader'; import K8sHeader from '../K8sHeader';
import LoadingContainer from '../LoadingContainer'; import LoadingContainer from '../LoadingContainer';
@ -137,6 +139,11 @@ function K8sStatefulSetsList({
} }
}, [quickFiltersLastUpdated]); }, [quickFiltersLastUpdated]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const createFiltersForSelectedRowData = ( const createFiltersForSelectedRowData = (
selectedRowData: K8sStatefulSetsRowData, selectedRowData: K8sStatefulSetsRowData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -196,6 +203,8 @@ function K8sStatefulSetsList({
queryKey: ['statefulSetList', fetchGroupedByRowDataQuery], queryKey: ['statefulSetList', fetchGroupedByRowDataQuery],
enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData, enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData,
}, },
undefined,
dotMetricsEnabled,
); );
const { const {
@ -204,8 +213,10 @@ function K8sStatefulSetsList({
} = useGetAggregateKeys( } = useGetAggregateKeys(
{ {
dataSource: currentQuery.builder.queryData[0].dataSource, dataSource: currentQuery.builder.queryData[0].dataSource,
aggregateAttribute: aggregateAttribute: GetK8sEntityToAggregateAttribute(
K8sEntityToAggregateAttributeMapping[K8sCategory.STATEFULSETS], K8sCategory.STATEFULSETS,
dotMetricsEnabled,
),
aggregateOperator: 'noop', aggregateOperator: 'noop',
searchText: '', searchText: '',
tagType: '', tagType: '',
@ -251,6 +262,8 @@ function K8sStatefulSetsList({
queryKey: ['statefulSetList', query], queryKey: ['statefulSetList', query],
enabled: !!query, enabled: !!query,
}, },
undefined,
dotMetricsEnabled,
); );
const statefulSetsData = useMemo(() => data?.payload?.data?.records || [], [ const statefulSetsData = useMemo(() => data?.payload?.data?.records || [], [

View File

@ -38,7 +38,56 @@ export const getStatefulSetMetricsQueryPayload = (
statefulSet: K8sStatefulSetsData, statefulSet: K8sStatefulSetsData,
start: number, start: number,
end: number, end: number,
): GetQueryResultsProps[] => [ dotMetricsEnabled: boolean,
): GetQueryResultsProps[] => {
const k8sStatefulSetNameKey = dotMetricsEnabled
? 'k8s.statefulset.name'
: 'k8s_statefulset_name';
const k8sNamespaceNameKey = dotMetricsEnabled
? 'k8s.namespace.name'
: 'k8s_namespace_name';
const k8sPodNameKey = dotMetricsEnabled ? 'k8s.pod.name' : 'k8s_pod_name';
const k8sPodCpuUtilKey = dotMetricsEnabled
? 'k8s.pod.cpu.utilization'
: 'k8s_pod_cpu_utilization';
const k8sContainerCpuRequestKey = dotMetricsEnabled
? 'k8s.container.cpu_request'
: 'k8s_container_cpu_request';
const k8sContainerCpuLimitKey = dotMetricsEnabled
? 'k8s.container.cpu_limit'
: 'k8s_container_cpu_limit';
const k8sPodCpuReqUtilKey = dotMetricsEnabled
? 'k8s.pod.cpu_request_utilization'
: 'k8s_pod_cpu_request_utilization';
const k8sPodCpuLimitUtilKey = dotMetricsEnabled
? 'k8s.pod.cpu_limit_utilization'
: 'k8s_pod_cpu_limit_utilization';
const k8sPodMemUsageKey = dotMetricsEnabled
? 'k8s.pod.memory.usage'
: 'k8s_pod_memory_usage';
const k8sContainerMemRequestKey = dotMetricsEnabled
? 'k8s.container.memory_request'
: 'k8s_container_memory_request';
const k8sContainerMemLimitKey = dotMetricsEnabled
? 'k8s.container.memory_limit'
: 'k8s_container_memory_limit';
const k8sPodMemReqUtilKey = dotMetricsEnabled
? 'k8s.pod.memory_request_utilization'
: 'k8s_pod_memory_request_utilization';
const k8sPodMemLimitUtilKey = dotMetricsEnabled
? 'k8s.pod.memory_limit_utilization'
: 'k8s_pod_memory_limit_utilization';
const k8sPodNetworkIoKey = dotMetricsEnabled
? 'k8s.pod.network.io'
: 'k8s_pod_network_io';
const k8sPodNetworkErrorsKey = dotMetricsEnabled
? 'k8s.pod.network.errors'
: 'k8s_pod_network_errors';
return [
{ {
selectedTime: 'GLOBAL_TIME', selectedTime: 'GLOBAL_TIME',
graphType: PANEL_TYPES.TIME_SERIES, graphType: PANEL_TYPES.TIME_SERIES,
@ -48,10 +97,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_cpu_utilization--float64--Gauge--true', id: 'cpu_usage',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_cpu_utilization', key: k8sPodCpuUtilKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -61,26 +110,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '8627bd22', id: 'f1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_statefulset_name--string--tag--false', id: 'ss_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_name', key: k8sStatefulSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -104,10 +153,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_container_cpu_request--float64--Gauge--true', id: 'cpu_request',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_cpu_request', key: k8sContainerCpuRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -117,26 +166,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '82f07131', id: 'f3',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_pod_name--string--tag--false', id: 'pod_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -160,10 +209,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_container_cpu_limit--float64--Gauge--true', id: 'cpu_limit',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_cpu_limit', key: k8sContainerCpuLimitKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -173,26 +222,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '9c669f4f', id: 'f4',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_pod_name--string--tag--false', id: 'pod_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -216,23 +265,9 @@ export const getStatefulSetMetricsQueryPayload = (
], ],
queryFormulas: [], queryFormulas: [],
}, },
clickhouse_sql: [ clickhouse_sql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
id: v4(), id: v4(),
promql: [ promql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
}, },
variables: {}, variables: {},
@ -249,10 +284,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_cpu_request_utilization--float64--Gauge--true', id: 'cpu_req_util',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_cpu_request_utilization', key: k8sPodCpuReqUtilKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -262,26 +297,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '3c835082', id: 'f1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_statefulset_name--string--tag--false', id: 'ss_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_name', key: k8sStatefulSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -305,10 +340,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_cpu_limit_utilization--float64--Gauge--true', id: 'cpu_limit_util',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_cpu_limit_utilization', key: k8sPodCpuLimitUtilKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -318,26 +353,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: 'c0a5e5b1', id: 'f1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_statefulset_name--string--tag--false', id: 'ss_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_name', key: k8sStatefulSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -361,23 +396,9 @@ export const getStatefulSetMetricsQueryPayload = (
], ],
queryFormulas: [], queryFormulas: [],
}, },
clickhouse_sql: [ clickhouse_sql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
id: v4(), id: v4(),
promql: [ promql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
}, },
variables: {}, variables: {},
@ -394,10 +415,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_memory_usage--float64--Gauge--true', id: 'mem_usage',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_usage', key: k8sPodMemUsageKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -407,26 +428,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: 'f8ae7d0f', id: 'f1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_statefulset_name--string--tag--false', id: 'ss_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_name', key: k8sStatefulSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -450,10 +471,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_container_memory_request--float64--Gauge--true', id: 'mem_request',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_memory_request', key: k8sContainerMemRequestKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -463,26 +484,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '66fbdd5e', id: 'f3',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_pod_name--string--tag--false', id: 'pod_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -506,10 +527,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_container_memory_limit--float64--Gauge--true', id: 'mem_limit',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_container_memory_limit', key: k8sContainerMemLimitKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'latest', aggregateOperator: 'latest',
@ -519,26 +540,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '1a408383', id: 'f4',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_pod_name--string--tag--false', id: 'pod_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_pod_name', key: k8sPodNameKey,
type: 'tag', type: 'tag',
}, },
op: 'contains', op: 'contains',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -562,23 +583,9 @@ export const getStatefulSetMetricsQueryPayload = (
], ],
queryFormulas: [], queryFormulas: [],
}, },
clickhouse_sql: [ clickhouse_sql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
id: v4(), id: v4(),
promql: [ promql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
}, },
variables: {}, variables: {},
@ -595,10 +602,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_memory_request_utilization--float64--Gauge--true', id: 'mem_req_util',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_request_utilization', key: k8sPodMemReqUtilKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -608,26 +615,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: 'acdccfa2', id: 'f1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_statefulset_name--string--tag--false', id: 'ss_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_name', key: k8sStatefulSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -651,10 +658,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_memory_limit_utilization--float64--Gauge--true', id: 'mem_limit_util',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_memory_limit_utilization', key: k8sPodMemLimitUtilKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -664,26 +671,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: 'cc9a85d3', id: 'f1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_statefulset_name--string--tag--false', id: 'ss_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_name', key: k8sStatefulSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -707,23 +714,9 @@ export const getStatefulSetMetricsQueryPayload = (
], ],
queryFormulas: [], queryFormulas: [],
}, },
clickhouse_sql: [ clickhouse_sql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
id: v4(), id: v4(),
promql: [ promql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
}, },
variables: {}, variables: {},
@ -740,10 +733,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_network_io--float64--Sum--true', id: 'net_io',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_network_io', key: k8sPodNetworkIoKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'rate', aggregateOperator: 'rate',
@ -753,26 +746,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '2ea33f83', id: 'f1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_statefulset_name--string--tag--false', id: 'ss_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_name', key: k8sStatefulSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -785,7 +778,7 @@ export const getStatefulSetMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'direction--string--tag--false', id: 'direction',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'direction', key: 'direction',
@ -793,7 +786,7 @@ export const getStatefulSetMetricsQueryPayload = (
}, },
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'interface--string--tag--false', id: 'interface',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'interface', key: 'interface',
@ -813,23 +806,9 @@ export const getStatefulSetMetricsQueryPayload = (
], ],
queryFormulas: [], queryFormulas: [],
}, },
clickhouse_sql: [ clickhouse_sql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
id: v4(), id: v4(),
promql: [ promql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
}, },
variables: {}, variables: {},
@ -846,10 +825,10 @@ export const getStatefulSetMetricsQueryPayload = (
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_pod_network_errors--float64--Sum--true', id: 'net_err',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_pod_network_errors', key: k8sPodNetworkErrorsKey,
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'increase', aggregateOperator: 'increase',
@ -859,26 +838,26 @@ export const getStatefulSetMetricsQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '7e25d4fb', id: 'f1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_statefulset_name--string--tag--false', id: 'ss_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_statefulset_name', key: k8sStatefulSetNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: statefulSet.meta.k8s_statefulset_name, value: statefulSet.meta.k8s_statefulset_name,
}, },
{ {
id: '47b3adae', id: 'f2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'ns_name',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
@ -891,7 +870,7 @@ export const getStatefulSetMetricsQueryPayload = (
groupBy: [ groupBy: [
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'direction--string--tag--false', id: 'direction',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'direction', key: 'direction',
@ -899,7 +878,7 @@ export const getStatefulSetMetricsQueryPayload = (
}, },
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'interface--string--tag--false', id: 'interface',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'interface', key: 'interface',
@ -919,23 +898,9 @@ export const getStatefulSetMetricsQueryPayload = (
], ],
queryFormulas: [], queryFormulas: [],
}, },
clickhouse_sql: [ clickhouse_sql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
id: v4(), id: v4(),
promql: [ promql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
}, },
variables: {}, variables: {},
@ -944,3 +909,4 @@ export const getStatefulSetMetricsQueryPayload = (
end, end,
}, },
]; ];
};

View File

@ -236,6 +236,11 @@ export const getK8sStatefulSetsListColumns = (
return columnsConfig as ColumnType<K8sStatefulSetsRowData>[]; return columnsConfig as ColumnType<K8sStatefulSetsRowData>[];
}; };
const dotToUnder: Record<string, keyof K8sStatefulSetsData['meta']> = {
'k8s.namespace.name': 'k8s_namespace_name',
'k8s.statefulset.name': 'k8s_statefulset_name',
};
const getGroupByEle = ( const getGroupByEle = (
statefulSet: K8sStatefulSetsData, statefulSet: K8sStatefulSetsData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -243,9 +248,14 @@ const getGroupByEle = (
const groupByValues: string[] = []; const groupByValues: string[] = [];
groupBy.forEach((group) => { groupBy.forEach((group) => {
groupByValues.push( const rawKey = group.key as string;
statefulSet.meta[group.key as keyof typeof statefulSet.meta],
); // Choose mapped key if present, otherwise use rawKey
const metaKey = (dotToUnder[rawKey] ??
rawKey) as keyof typeof statefulSet.meta;
const value = statefulSet.meta[metaKey];
groupByValues.push(value);
}); });
return ( return (

View File

@ -29,11 +29,13 @@ import { AppState } from 'store/reducers';
import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData'; import { IBuilderQuery } from 'types/api/queryBuilder/queryBuilderData';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { getOrderByFromParams } from '../commonUtils'; import { getOrderByFromParams } from '../commonUtils';
import { import {
GetK8sEntityToAggregateAttribute,
INFRA_MONITORING_K8S_PARAMS_KEYS, INFRA_MONITORING_K8S_PARAMS_KEYS,
K8sCategory, K8sCategory,
K8sEntityToAggregateAttributeMapping,
} from '../constants'; } from '../constants';
import K8sHeader from '../K8sHeader'; import K8sHeader from '../K8sHeader';
import LoadingContainer from '../LoadingContainer'; import LoadingContainer from '../LoadingContainer';
@ -137,6 +139,11 @@ function K8sVolumesList({
} }
}, [quickFiltersLastUpdated]); }, [quickFiltersLastUpdated]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const createFiltersForSelectedRowData = ( const createFiltersForSelectedRowData = (
selectedRowData: K8sVolumesRowData, selectedRowData: K8sVolumesRowData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -190,10 +197,15 @@ function K8sVolumesList({
isLoading: isLoadingGroupedByRowData, isLoading: isLoadingGroupedByRowData,
isError: isErrorGroupedByRowData, isError: isErrorGroupedByRowData,
refetch: fetchGroupedByRowData, refetch: fetchGroupedByRowData,
} = useGetK8sVolumesList(fetchGroupedByRowDataQuery as K8sVolumesListPayload, { } = useGetK8sVolumesList(
fetchGroupedByRowDataQuery as K8sVolumesListPayload,
{
queryKey: ['volumeList', fetchGroupedByRowDataQuery], queryKey: ['volumeList', fetchGroupedByRowDataQuery],
enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData, enabled: !!fetchGroupedByRowDataQuery && !!selectedRowData,
}); },
undefined,
dotMetricsEnabled,
);
const { const {
data: groupByFiltersData, data: groupByFiltersData,
@ -201,7 +213,10 @@ function K8sVolumesList({
} = useGetAggregateKeys( } = useGetAggregateKeys(
{ {
dataSource: currentQuery.builder.queryData[0].dataSource, dataSource: currentQuery.builder.queryData[0].dataSource,
aggregateAttribute: K8sEntityToAggregateAttributeMapping[K8sCategory.NODES], aggregateAttribute: GetK8sEntityToAggregateAttribute(
K8sCategory.NODES,
dotMetricsEnabled,
),
aggregateOperator: 'noop', aggregateOperator: 'noop',
searchText: '', searchText: '',
tagType: '', tagType: '',
@ -247,6 +262,8 @@ function K8sVolumesList({
queryKey: ['volumeList', query], queryKey: ['volumeList', query],
enabled: !!query, enabled: !!query,
}, },
undefined,
dotMetricsEnabled,
); );
const volumesData = useMemo(() => data?.payload?.data?.records || [], [data]); const volumesData = useMemo(() => data?.payload?.data?.records || [], [data]);

View File

@ -34,7 +34,40 @@ export const getVolumeQueryPayload = (
volume: K8sVolumesData, volume: K8sVolumesData,
start: number, start: number,
end: number, end: number,
): GetQueryResultsProps[] => [ dotMetricsEnabled: boolean,
): GetQueryResultsProps[] => {
const k8sClusterNameKey = dotMetricsEnabled
? 'k8s.cluster.name'
: 'k8s_cluster_name';
const k8sNamespaceNameKey = dotMetricsEnabled
? 'k8s.namespace.name'
: 'k8s_namespace_name';
const k8sVolumeAvailableKey = dotMetricsEnabled
? 'k8s.volume.available'
: 'k8s_volume_available';
const k8sVolumeCapacityKey = dotMetricsEnabled
? 'k8s.volume.capacity'
: 'k8s_volume_capacity';
const k8sVolumeInodesUsedKey = dotMetricsEnabled
? 'k8s.volume.inodes.used'
: 'k8s_volume_inodes_used';
const k8sVolumeInodesKey = dotMetricsEnabled
? 'k8s.volume.inodes'
: 'k8s_volume_inodes';
const k8sVolumeInodesFreeKey = dotMetricsEnabled
? 'k8s.volume.inodes.free'
: 'k8s_volume_inodes_free';
const k8sVolumeTypeKey = dotMetricsEnabled
? 'k8s.volume.type'
: 'k8s_volume_type';
const k8sPVCNameKey = dotMetricsEnabled
? 'k8s.persistentvolumeclaim.name'
: 'k8s_persistentvolumeclaim_name';
const legendTemplate = dotMetricsEnabled
? '{{k8s.namespace.name}}-{{k8s.pod.name}}'
: '{{k8s_namespace_name}}-{{k8s_pod_name}}';
return [
{ {
selectedTime: 'GLOBAL_TIME', selectedTime: 'GLOBAL_TIME',
graphType: PANEL_TYPES.TIME_SERIES, graphType: PANEL_TYPES.TIME_SERIES,
@ -47,7 +80,7 @@ export const getVolumeQueryPayload = (
id: 'k8s_volume_available--float64--Gauge--true', id: 'k8s_volume_available--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_volume_available', key: k8sVolumeAvailableKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -57,50 +90,49 @@ export const getVolumeQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '6077fbc2', id: 'c1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_cluster_name--string--tag--false', id: 'k8s_cluster_name--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_cluster_name', key: k8sClusterNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: volume.meta.k8s_cluster_name, value: volume.meta.k8s_cluster_name,
}, },
{ {
id: '6077fbc2', id: 'c2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: 'in', op: 'in',
value: [volume.meta.k8s_namespace_name], value: [volume.meta.k8s_namespace_name],
}, },
{ {
id: '217757e9', id: 'c3',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_volume_type--string--tag--false', id: 'k8s_volume_type--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_volume_type', key: k8sVolumeTypeKey,
type: 'tag', type: 'tag',
}, },
op: 'in', op: 'in',
value: ['persistentVolumeClaim'], value: ['persistentVolumeClaim'],
}, },
{ {
id: '34754bda', id: 'c4',
key: { key: {
key: 'k8s_persistentvolumeclaim_name',
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'tag',
isColumn: false,
isJSON: false,
id: 'k8s_persistentvolumeclaim_name--string--tag--false', id: 'k8s_persistentvolumeclaim_name--string--tag--false',
isColumn: false,
key: k8sPVCNameKey,
type: 'tag',
}, },
op: '=', op: '=',
value: volume.persistentVolumeClaimName, value: volume.persistentVolumeClaimName,
@ -111,7 +143,7 @@ export const getVolumeQueryPayload = (
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
legend: '{{k8s_namespace_name}}-{{k8s_pod_name}}', legend: legendTemplate,
limit: null, limit: null,
orderBy: [], orderBy: [],
queryName: 'A', queryName: 'A',
@ -123,23 +155,9 @@ export const getVolumeQueryPayload = (
], ],
queryFormulas: [], queryFormulas: [],
}, },
clickhouse_sql: [ clickhouse_sql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
id: v4(), id: v4(),
promql: [ promql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
}, },
variables: {}, variables: {},
@ -159,7 +177,7 @@ export const getVolumeQueryPayload = (
id: 'k8s_volume_capacity--float64--Gauge--true', id: 'k8s_volume_capacity--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'k8s_volume_capacity', key: k8sVolumeCapacityKey,
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -169,50 +187,49 @@ export const getVolumeQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '6077fbc2', id: 'c1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_cluster_name--string--tag--false', id: 'k8s_cluster_name--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_cluster_name', key: k8sClusterNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: volume.meta.k8s_cluster_name, value: volume.meta.k8s_cluster_name,
}, },
{ {
id: '0cdebb88', id: 'c2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: 'in', op: 'in',
value: [volume.meta.k8s_namespace_name], value: [volume.meta.k8s_namespace_name],
}, },
{ {
id: 'e0e880ce', id: 'c3',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_volume_type--string--tag--false', id: 'k8s_volume_type--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_volume_type', key: k8sVolumeTypeKey,
type: 'tag', type: 'tag',
}, },
op: 'in', op: 'in',
value: ['persistentVolumeClaim'], value: ['persistentVolumeClaim'],
}, },
{ {
id: '34754bda', id: 'c4',
key: { key: {
key: 'k8s_persistentvolumeclaim_name',
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'tag',
isColumn: false,
isJSON: false,
id: 'k8s_persistentvolumeclaim_name--string--tag--false', id: 'k8s_persistentvolumeclaim_name--string--tag--false',
isColumn: false,
key: k8sPVCNameKey,
type: 'tag',
}, },
op: '=', op: '=',
value: volume.persistentVolumeClaimName, value: volume.persistentVolumeClaimName,
@ -223,7 +240,7 @@ export const getVolumeQueryPayload = (
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
legend: '{{k8s_namespace_name}}-{{k8s_pod_name}}', legend: legendTemplate,
limit: null, limit: null,
orderBy: [], orderBy: [],
queryName: 'A', queryName: 'A',
@ -235,23 +252,9 @@ export const getVolumeQueryPayload = (
], ],
queryFormulas: [], queryFormulas: [],
}, },
clickhouse_sql: [ clickhouse_sql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
id: v4(), id: v4(),
promql: [ promql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
}, },
variables: {}, variables: {},
@ -270,7 +273,7 @@ export const getVolumeQueryPayload = (
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_volume_inodes_used--float64----true', id: 'k8s_volume_inodes_used--float64----true',
isColumn: true, isColumn: true,
key: 'k8s_volume_inodes_used', key: k8sVolumeInodesUsedKey,
type: '', type: '',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -280,50 +283,49 @@ export const getVolumeQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '6077fbc2', id: 'c1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_cluster_name--string--tag--false', id: 'k8s_cluster_name--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_cluster_name', key: k8sClusterNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: volume.meta.k8s_cluster_name, value: volume.meta.k8s_cluster_name,
}, },
{ {
id: '46393c61', id: 'c2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: 'in', op: 'in',
value: [volume.meta.k8s_namespace_name], value: [volume.meta.k8s_namespace_name],
}, },
{ {
id: '450ee3cb', id: 'c3',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_volume_type--string--tag--false', id: 'k8s_volume_type--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_volume_type', key: k8sVolumeTypeKey,
type: 'tag', type: 'tag',
}, },
op: 'in', op: 'in',
value: ['persistentVolumeClaim'], value: ['persistentVolumeClaim'],
}, },
{ {
id: '34754bda', id: 'c4',
key: { key: {
key: 'k8s_persistentvolumeclaim_name',
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'tag',
isColumn: false,
isJSON: false,
id: 'k8s_persistentvolumeclaim_name--string--tag--false', id: 'k8s_persistentvolumeclaim_name--string--tag--false',
isColumn: false,
key: k8sPVCNameKey,
type: 'tag',
}, },
op: '=', op: '=',
value: volume.persistentVolumeClaimName, value: volume.persistentVolumeClaimName,
@ -333,7 +335,7 @@ export const getVolumeQueryPayload = (
}, },
groupBy: [], groupBy: [],
having: [], having: [],
legend: '{{k8s_namespace_name}}-{{k8s_pod_name}}', legend: legendTemplate,
limit: null, limit: null,
orderBy: [], orderBy: [],
queryName: 'A', queryName: 'A',
@ -346,23 +348,9 @@ export const getVolumeQueryPayload = (
], ],
queryFormulas: [], queryFormulas: [],
}, },
clickhouse_sql: [ clickhouse_sql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
id: v4(), id: v4(),
promql: [ promql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
}, },
variables: {}, variables: {},
@ -381,7 +369,7 @@ export const getVolumeQueryPayload = (
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_volume_inodes--float64----true', id: 'k8s_volume_inodes--float64----true',
isColumn: true, isColumn: true,
key: 'k8s_volume_inodes', key: k8sVolumeInodesKey,
type: '', type: '',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -391,50 +379,49 @@ export const getVolumeQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '6077fbc2', id: 'c1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_cluster_name--string--tag--false', id: 'k8s_cluster_name--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_cluster_name', key: k8sClusterNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: volume.meta.k8s_cluster_name, value: volume.meta.k8s_cluster_name,
}, },
{ {
id: '5a604bad', id: 'c2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: 'in', op: 'in',
value: [volume.meta.k8s_namespace_name], value: [volume.meta.k8s_namespace_name],
}, },
{ {
id: '24b074f3', id: 'c3',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_volume_type--string--tag--false', id: 'k8s_volume_type--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_volume_type', key: k8sVolumeTypeKey,
type: 'tag', type: 'tag',
}, },
op: 'in', op: 'in',
value: ['persistentVolumeClaim'], value: ['persistentVolumeClaim'],
}, },
{ {
id: '34754bda', id: 'c4',
key: { key: {
key: 'k8s_persistentvolumeclaim_name',
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'tag',
isColumn: false,
isJSON: false,
id: 'k8s_persistentvolumeclaim_name--string--tag--false', id: 'k8s_persistentvolumeclaim_name--string--tag--false',
isColumn: false,
key: k8sPVCNameKey,
type: 'tag',
}, },
op: '=', op: '=',
value: volume.persistentVolumeClaimName, value: volume.persistentVolumeClaimName,
@ -444,7 +431,7 @@ export const getVolumeQueryPayload = (
}, },
groupBy: [], groupBy: [],
having: [], having: [],
legend: '{{k8s_namespace_name}}-{{k8s_pod_name}}', legend: legendTemplate,
limit: null, limit: null,
orderBy: [], orderBy: [],
queryName: 'A', queryName: 'A',
@ -457,23 +444,9 @@ export const getVolumeQueryPayload = (
], ],
queryFormulas: [], queryFormulas: [],
}, },
clickhouse_sql: [ clickhouse_sql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
id: v4(), id: v4(),
promql: [ promql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
}, },
variables: {}, variables: {},
@ -492,7 +465,7 @@ export const getVolumeQueryPayload = (
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'k8s_volume_inodes_free--float64----true', id: 'k8s_volume_inodes_free--float64----true',
isColumn: true, isColumn: true,
key: 'k8s_volume_inodes_free', key: k8sVolumeInodesFreeKey,
type: '', type: '',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -502,50 +475,49 @@ export const getVolumeQueryPayload = (
filters: { filters: {
items: [ items: [
{ {
id: '6077fbc2', id: 'c1',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_cluster_name--string--tag--false', id: 'k8s_cluster_name--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_cluster_name', key: k8sClusterNameKey,
type: 'tag', type: 'tag',
}, },
op: '=', op: '=',
value: volume.meta.k8s_cluster_name, value: volume.meta.k8s_cluster_name,
}, },
{ {
id: '8f01b14d', id: 'c2',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_namespace_name--string--tag--false', id: 'k8s_namespace_name--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_namespace_name', key: k8sNamespaceNameKey,
type: 'tag', type: 'tag',
}, },
op: 'in', op: 'in',
value: [volume.meta.k8s_namespace_name], value: [volume.meta.k8s_namespace_name],
}, },
{ {
id: 'a72c99da', id: 'c3',
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
id: 'k8s_volume_type--string--tag--false', id: 'k8s_volume_type--string--tag--false',
isColumn: false, isColumn: false,
key: 'k8s_volume_type', key: k8sVolumeTypeKey,
type: 'tag', type: 'tag',
}, },
op: 'in', op: 'in',
value: ['persistentVolumeClaim'], value: ['persistentVolumeClaim'],
}, },
{ {
id: '34754bda', id: 'c4',
key: { key: {
key: 'k8s_persistentvolumeclaim_name',
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'tag',
isColumn: false,
isJSON: false,
id: 'k8s_persistentvolumeclaim_name--string--tag--false', id: 'k8s_persistentvolumeclaim_name--string--tag--false',
isColumn: false,
key: k8sPVCNameKey,
type: 'tag',
}, },
op: '=', op: '=',
value: volume.persistentVolumeClaimName, value: volume.persistentVolumeClaimName,
@ -555,7 +527,7 @@ export const getVolumeQueryPayload = (
}, },
groupBy: [], groupBy: [],
having: [], having: [],
legend: '{{k8s_namespace_name}}-{{k8s_pod_name}}', legend: legendTemplate,
limit: null, limit: null,
orderBy: [], orderBy: [],
queryName: 'A', queryName: 'A',
@ -568,23 +540,9 @@ export const getVolumeQueryPayload = (
], ],
queryFormulas: [], queryFormulas: [],
}, },
clickhouse_sql: [ clickhouse_sql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
id: v4(), id: v4(),
promql: [ promql: [{ disabled: false, legend: '', name: 'A', query: '' }],
{
disabled: false,
legend: '',
name: 'A',
query: '',
},
],
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
}, },
variables: {}, variables: {},
@ -593,3 +551,4 @@ export const getVolumeQueryPayload = (
end, end,
}, },
]; ];
};

View File

@ -142,6 +142,16 @@ export const getK8sVolumesListColumns = (
return columnsConfig as ColumnType<K8sVolumesRowData>[]; return columnsConfig as ColumnType<K8sVolumesRowData>[];
}; };
const dotToUnder: Record<string, keyof K8sVolumesData['meta']> = {
'k8s.namespace.name': 'k8s_namespace_name',
'k8s.node.name': 'k8s_node_name',
'k8s.pod.name': 'k8s_pod_name',
'k8s.pod.uid': 'k8s_pod_uid',
'k8s.statefulset.name': 'k8s_statefulset_name',
'k8s.cluster.name': 'k8s_cluster_name',
'k8s.persistentvolumeclaim.name': 'k8s_persistentvolumeclaim_name',
};
const getGroupByEle = ( const getGroupByEle = (
volume: K8sVolumesData, volume: K8sVolumesData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -149,7 +159,13 @@ const getGroupByEle = (
const groupByValues: string[] = []; const groupByValues: string[] = [];
groupBy.forEach((group) => { groupBy.forEach((group) => {
groupByValues.push(volume.meta[group.key as keyof typeof volume.meta]); const rawKey = group.key as string;
const metaKey = (dotToUnder[rawKey] ?? rawKey) as keyof typeof volume.meta;
const value = volume.meta[metaKey];
groupByValues.push(value);
}); });
return ( return (

View File

@ -36,7 +36,7 @@ export const K8sCategories = {
VOLUMES: 'volumes', VOLUMES: 'volumes',
}; };
export const K8sEntityToAggregateAttributeMapping = { export const underscoreMap = {
[K8sCategory.HOSTS]: 'system_cpu_load_average_15m', [K8sCategory.HOSTS]: 'system_cpu_load_average_15m',
[K8sCategory.PODS]: 'k8s_pod_cpu_utilization', [K8sCategory.PODS]: 'k8s_pod_cpu_utilization',
[K8sCategory.NODES]: 'k8s_node_cpu_utilization', [K8sCategory.NODES]: 'k8s_node_cpu_utilization',
@ -50,20 +50,66 @@ export const K8sEntityToAggregateAttributeMapping = {
[K8sCategory.VOLUMES]: 'k8s_volume_capacity', [K8sCategory.VOLUMES]: 'k8s_volume_capacity',
}; };
export const PodsQuickFiltersConfig: IQuickFiltersConfig[] = [ export const dotMap = {
[K8sCategory.HOSTS]: 'system.cpu.load_average.15m',
[K8sCategory.PODS]: 'k8s.pod.cpu.utilization',
[K8sCategory.NODES]: 'k8s.node.cpu.utilization',
[K8sCategory.NAMESPACES]: 'k8s.pod.cpu.utilization',
[K8sCategory.CLUSTERS]: 'k8s.node.cpu.utilization',
[K8sCategory.DEPLOYMENTS]: 'k8s.pod.cpu.utilization',
[K8sCategory.STATEFULSETS]: 'k8s.pod.cpu.utilization',
[K8sCategory.DAEMONSETS]: 'k8s.pod.cpu.utilization',
[K8sCategory.CONTAINERS]: 'k8s.pod.cpu.utilization',
[K8sCategory.JOBS]: 'k8s.job.desired_successful_pods',
[K8sCategory.VOLUMES]: 'k8s.volume.capacity',
};
export function GetK8sEntityToAggregateAttribute(
category: K8sCategory,
dotMetricsEnabled: boolean,
): string {
return dotMetricsEnabled ? dotMap[category] : underscoreMap[category];
}
export function GetPodsQuickFiltersConfig(
dotMetricsEnabled: boolean,
): IQuickFiltersConfig[] {
const podKey = dotMetricsEnabled ? 'k8s.pod.name' : 'k8s_pod_name';
const namespaceKey = dotMetricsEnabled
? 'k8s.namespace.name'
: 'k8s_namespace_name';
const nodeKey = dotMetricsEnabled ? 'k8s.node.name' : 'k8s_node_name';
const clusterKey = dotMetricsEnabled ? 'k8s.cluster.name' : 'k8s_cluster_name';
const deploymentKey = dotMetricsEnabled
? 'k8s.deployment.name'
: 'k8s_deployment_name';
const statefulsetKey = dotMetricsEnabled
? 'k8s.statefulset.name'
: 'k8s_statefulset_name';
const daemonsetKey = dotMetricsEnabled
? 'k8s.daemonset.name'
: 'k8s_daemonset_name';
const jobKey = dotMetricsEnabled ? 'k8s.job.name' : 'k8s_job_name';
// Define aggregate attribute (metric) name
const cpuUtilizationMetric = dotMetricsEnabled
? 'k8s.pod.cpu.utilization'
: 'k8s_pod_cpu_utilization';
return [
{ {
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Pod', title: 'Pod',
attributeKey: { attributeKey: {
key: 'k8s_pod_name', key: podKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'tag', type: 'tag',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: 'k8s_pod_name--string--tag--true', id: `${podKey}--string--tag--true`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilizationMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -71,14 +117,15 @@ export const PodsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Namespace', title: 'Namespace',
attributeKey: { attributeKey: {
key: 'k8s_namespace_name', key: namespaceKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${namespaceKey}--string--resource--false`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilizationMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: false, defaultOpen: false,
}, },
@ -86,15 +133,15 @@ export const PodsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Node', title: 'Node',
attributeKey: { attributeKey: {
key: 'k8s_node_name', key: nodeKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: 'k8s.node.name--string--resource--true', id: `${nodeKey}--string--resource--false`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilizationMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: false, defaultOpen: false,
}, },
@ -102,14 +149,15 @@ export const PodsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Cluster', title: 'Cluster',
attributeKey: { attributeKey: {
key: 'k8s_cluster_name', key: clusterKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${clusterKey}--string--resource--false`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilizationMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: false, defaultOpen: false,
}, },
@ -117,14 +165,15 @@ export const PodsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Deployment', title: 'Deployment',
attributeKey: { attributeKey: {
key: 'k8s_deployment_name', key: deploymentKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${deploymentKey}--string--resource--false`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilizationMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: false, defaultOpen: false,
}, },
@ -132,14 +181,15 @@ export const PodsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Statefulset', title: 'Statefulset',
attributeKey: { attributeKey: {
key: 'k8s_statefulset_name', key: statefulsetKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${statefulsetKey}--string--resource--false`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilizationMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: false, defaultOpen: false,
}, },
@ -147,14 +197,15 @@ export const PodsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'DaemonSet', title: 'DaemonSet',
attributeKey: { attributeKey: {
key: 'k8s_daemonset_name', key: daemonsetKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${daemonsetKey}--string--resource--false`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilizationMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: false, defaultOpen: false,
}, },
@ -162,32 +213,47 @@ export const PodsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Job', title: 'Job',
attributeKey: { attributeKey: {
key: 'k8s_job_name', key: jobKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${jobKey}--string--resource--false`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilizationMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: false, defaultOpen: false,
}, },
]; ];
}
export const NodesQuickFiltersConfig: IQuickFiltersConfig[] = [ export function GetNodesQuickFiltersConfig(
dotMetricsEnabled: boolean,
): IQuickFiltersConfig[] {
// Define attribute keys
const nodeKey = dotMetricsEnabled ? 'k8s.node.name' : 'k8s_node_name';
const clusterKey = dotMetricsEnabled ? 'k8s.cluster.name' : 'k8s_cluster_name';
// Define aggregate metric name for node CPU utilization
const cpuUtilMetric = dotMetricsEnabled
? 'k8s.node.cpu.utilization'
: 'k8s_node_cpu_utilization';
return [
{ {
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Node Name', title: 'Node Name',
attributeKey: { attributeKey: {
key: 'k8s_node_name', key: nodeKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${nodeKey}--string--resource--true`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -195,32 +261,46 @@ export const NodesQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Cluster Name', title: 'Cluster Name',
attributeKey: { attributeKey: {
key: 'k8s_cluster_name', key: clusterKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${clusterKey}--string--resource--true`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
]; ];
}
export const NamespaceQuickFiltersConfig: IQuickFiltersConfig[] = [ export function GetNamespaceQuickFiltersConfig(
dotMetricsEnabled: boolean,
): IQuickFiltersConfig[] {
const namespaceKey = dotMetricsEnabled
? 'k8s.namespace.name'
: 'k8s_namespace_name';
const clusterKey = dotMetricsEnabled ? 'k8s.cluster.name' : 'k8s_cluster_name';
const cpuUtilMetric = dotMetricsEnabled
? 'k8s.pod.cpu.utilization'
: 'k8s_pod_cpu_utilization';
return [
{ {
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Namespace Name', title: 'Namespace Name',
attributeKey: { attributeKey: {
key: 'k8s_namespace_name', key: namespaceKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${namespaceKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -228,65 +308,101 @@ export const NamespaceQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Cluster Name', title: 'Cluster Name',
attributeKey: { attributeKey: {
key: 'k8s_cluster_name', key: clusterKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${clusterKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
]; ];
}
export const ClustersQuickFiltersConfig: IQuickFiltersConfig[] = [ export function GetClustersQuickFiltersConfig(
dotMetricsEnabled: boolean,
): IQuickFiltersConfig[] {
const clusterKey = dotMetricsEnabled ? 'k8s.cluster.name' : 'k8s_cluster_name';
const cpuUtilMetric = dotMetricsEnabled
? 'k8s.node.cpu.utilization'
: 'k8s_node_cpu_utilization';
return [
{ {
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Cluster Name', title: 'Cluster Name',
attributeKey: { attributeKey: {
key: 'k8s_cluster_name', key: clusterKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${clusterKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: cpuUtilMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
]; ];
}
export const ContainersQuickFiltersConfig: IQuickFiltersConfig[] = [ export function GetContainersQuickFiltersConfig(
dotMetricsEnabled: boolean,
): IQuickFiltersConfig[] {
const containerKey = dotMetricsEnabled
? 'k8s.container.name'
: 'k8s_container_name';
return [
{ {
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Container', title: 'Container',
attributeKey: { attributeKey: {
key: 'k8s_container_name', key: containerKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${containerKey}--string--resource`,
}, },
defaultOpen: true, defaultOpen: true,
}, },
]; ];
}
export const VolumesQuickFiltersConfig: IQuickFiltersConfig[] = [ export function GetVolumesQuickFiltersConfig(
dotMetricsEnabled: boolean,
): IQuickFiltersConfig[] {
const pvcKey = dotMetricsEnabled
? 'k8s.persistentvolumeclaim.name'
: 'k8s_persistentvolumeclaim_name';
const namespaceKey = dotMetricsEnabled
? 'k8s.namespace.name'
: 'k8s_namespace_name';
const clusterKey = dotMetricsEnabled ? 'k8s.cluster.name' : 'k8s_cluster_name';
const volumeMetric = dotMetricsEnabled
? 'k8s.volume.capacity'
: 'k8s_volume_capacity';
return [
{ {
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'PVC Volume Claim Name', title: 'PVC Volume Claim Name',
attributeKey: { attributeKey: {
key: 'k8s_persistentvolumeclaim_name', key: pvcKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${pvcKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_volume_capacity', aggregateAttribute: volumeMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -294,14 +410,15 @@ export const VolumesQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Namespace Name', title: 'Namespace Name',
attributeKey: { attributeKey: {
key: 'k8s_namespace_name', key: namespaceKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${namespaceKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_volume_capacity', aggregateAttribute: volumeMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -309,32 +426,49 @@ export const VolumesQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Cluster Name', title: 'Cluster Name',
attributeKey: { attributeKey: {
key: 'k8s_cluster_name', key: clusterKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${clusterKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_volume_capacity', aggregateAttribute: volumeMetric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
]; ];
}
export const DeploymentsQuickFiltersConfig: IQuickFiltersConfig[] = [ export function GetDeploymentsQuickFiltersConfig(
dotMetricsEnabled: boolean,
): IQuickFiltersConfig[] {
const deployKey = dotMetricsEnabled
? 'k8s.deployment.name'
: 'k8s_deployment_name';
const namespaceKey = dotMetricsEnabled
? 'k8s.namespace.name'
: 'k8s_namespace_name';
const clusterKey = dotMetricsEnabled ? 'k8s.cluster.name' : 'k8s_cluster_name';
const metric = dotMetricsEnabled
? 'k8s.pod.cpu.utilization'
: 'k8s_pod_cpu_utilization';
return [
{ {
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Deployment Name', title: 'Deployment Name',
attributeKey: { attributeKey: {
key: 'k8s_deployment_name', key: deployKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${deployKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -342,14 +476,15 @@ export const DeploymentsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Namespace Name', title: 'Namespace Name',
attributeKey: { attributeKey: {
key: 'k8s_namespace_name', key: namespaceKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${namespaceKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -357,32 +492,49 @@ export const DeploymentsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Cluster Name', title: 'Cluster Name',
attributeKey: { attributeKey: {
key: 'k8s_cluster_name', key: clusterKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${clusterKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
]; ];
}
export const StatefulsetsQuickFiltersConfig: IQuickFiltersConfig[] = [ export function GetStatefulsetsQuickFiltersConfig(
dotMetricsEnabled: boolean,
): IQuickFiltersConfig[] {
const ssKey = dotMetricsEnabled
? 'k8s.statefulset.name'
: 'k8s_statefulset_name';
const namespaceKey = dotMetricsEnabled
? 'k8s.namespace.name'
: 'k8s_namespace_name';
const clusterKey = dotMetricsEnabled ? 'k8s.cluster.name' : 'k8s_cluster_name';
const metric = dotMetricsEnabled
? 'k8s.pod.cpu.utilization'
: 'k8s_pod_cpu_utilization';
return [
{ {
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Statefulset Name', title: 'Statefulset Name',
attributeKey: { attributeKey: {
key: 'k8s_statefulset_name', key: ssKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${ssKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -390,14 +542,15 @@ export const StatefulsetsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Namespace Name', title: 'Namespace Name',
attributeKey: { attributeKey: {
key: 'k8s_namespace_name', key: namespaceKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${namespaceKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -405,32 +558,49 @@ export const StatefulsetsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Cluster Name', title: 'Cluster Name',
attributeKey: { attributeKey: {
key: 'k8s_cluster_name', key: clusterKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${clusterKey}--string--resource`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metric,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
]; ];
}
export const DaemonSetsQuickFiltersConfig: IQuickFiltersConfig[] = [ export function GetDaemonsetsQuickFiltersConfig(
dotMetricsEnabled: boolean,
): IQuickFiltersConfig[] {
const nameKey = dotMetricsEnabled
? 'k8s.daemonset.name'
: 'k8s_daemonset_name';
const namespaceKey = dotMetricsEnabled
? 'k8s.namespace.name'
: 'k8s_namespace_name';
const clusterKey = dotMetricsEnabled ? 'k8s.cluster.name' : 'k8s_cluster_name';
const metricName = dotMetricsEnabled
? 'k8s.pod.cpu.utilization'
: 'k8s_pod_cpu_utilization';
return [
{ {
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'DaemonSet Name', title: 'DaemonSet Name',
attributeKey: { attributeKey: {
key: 'k8s_daemonset_name', key: nameKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${nameKey}--string--resource--true`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metricName,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -438,14 +608,14 @@ export const DaemonSetsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Namespace Name', title: 'Namespace Name',
attributeKey: { attributeKey: {
key: 'k8s_namespace_name', key: namespaceKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metricName,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -453,32 +623,46 @@ export const DaemonSetsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Cluster Name', title: 'Cluster Name',
attributeKey: { attributeKey: {
key: 'k8s_cluster_name', key: clusterKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metricName,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
]; ];
}
export const JobsQuickFiltersConfig: IQuickFiltersConfig[] = [ export function GetJobsQuickFiltersConfig(
dotMetricsEnabled: boolean,
): IQuickFiltersConfig[] {
const nameKey = dotMetricsEnabled ? 'k8s.job.name' : 'k8s_job_name';
const namespaceKey = dotMetricsEnabled
? 'k8s.namespace.name'
: 'k8s_namespace_name';
const clusterKey = dotMetricsEnabled ? 'k8s.cluster.name' : 'k8s_cluster_name';
const metricName = dotMetricsEnabled
? 'k8s.pod.cpu.utilization'
: 'k8s_pod_cpu_utilization';
return [
{ {
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Job Name', title: 'Job Name',
attributeKey: { attributeKey: {
key: 'k8s_job_name', key: nameKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
id: `${nameKey}--string--resource--true`,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metricName,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -486,14 +670,14 @@ export const JobsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Namespace Name', title: 'Namespace Name',
attributeKey: { attributeKey: {
key: 'k8s_namespace_name', key: namespaceKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metricName,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
@ -501,18 +685,19 @@ export const JobsQuickFiltersConfig: IQuickFiltersConfig[] = [
type: FiltersType.CHECKBOX, type: FiltersType.CHECKBOX,
title: 'Cluster Name', title: 'Cluster Name',
attributeKey: { attributeKey: {
key: 'k8s_cluster_name', key: clusterKey,
dataType: DataTypes.String, dataType: DataTypes.String,
type: 'resource', type: 'resource',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
}, },
aggregateOperator: 'noop', aggregateOperator: 'noop',
aggregateAttribute: 'k8s_pod_cpu_utilization', aggregateAttribute: metricName,
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
defaultOpen: true, defaultOpen: true,
}, },
]; ];
}
export const getInvalidValueTooltipText = ( export const getInvalidValueTooltipText = (
entity: K8sCategory, entity: K8sCategory,

View File

@ -299,6 +299,19 @@ export const getK8sPodsListColumns = (
return updatedColumnsConfig as ColumnType<K8sPodsRowData>[]; return updatedColumnsConfig as ColumnType<K8sPodsRowData>[];
}; };
const dotToUnder: Record<string, keyof K8sPodsData['meta']> = {
'k8s.cronjob.name': 'k8s_cronjob_name',
'k8s.daemonset.name': 'k8s_daemonset_name',
'k8s.deployment.name': 'k8s_deployment_name',
'k8s.job.name': 'k8s_job_name',
'k8s.namespace.name': 'k8s_namespace_name',
'k8s.node.name': 'k8s_node_name',
'k8s.pod.name': 'k8s_pod_name',
'k8s.pod.uid': 'k8s_pod_uid',
'k8s.statefulset.name': 'k8s_statefulset_name',
'k8s.cluster.name': 'k8s_cluster_name',
};
const getGroupByEle = ( const getGroupByEle = (
pod: K8sPodsData, pod: K8sPodsData,
groupBy: IBuilderQuery['groupBy'], groupBy: IBuilderQuery['groupBy'],
@ -306,7 +319,13 @@ const getGroupByEle = (
const groupByValues: string[] = []; const groupByValues: string[] = [];
groupBy.forEach((group) => { groupBy.forEach((group) => {
groupByValues.push(pod.meta[group.key as keyof typeof pod.meta]); const rawKey = group.key as string;
// Choose mapped key if present, otherwise use rawKey
const metaKey = (dotToUnder[rawKey] ?? rawKey) as keyof typeof pod.meta;
const value = pod.meta[metaKey];
groupByValues.push(value);
}); });
return ( return (

View File

@ -15,6 +15,8 @@ import { SuccessResponse } from 'types/api';
import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange'; import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange';
import uPlot from 'uplot'; import uPlot from 'uplot';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { import {
getHostQueryPayload, getHostQueryPayload,
getNodeQueryPayload, getNodeQueryPayload,
@ -49,12 +51,23 @@ function NodeMetrics({
}; };
}, [logLineTimestamp]); }, [logLineTimestamp]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const queryPayloads = useMemo(() => { const queryPayloads = useMemo(() => {
if (nodeName) { if (nodeName) {
return getNodeQueryPayload(clusterName, nodeName, start, end); return getNodeQueryPayload(
clusterName,
nodeName,
start,
end,
dotMetricsEnabled,
);
} }
return getHostQueryPayload(hostName, start, end); return getHostQueryPayload(hostName, start, end, dotMetricsEnabled);
}, [nodeName, hostName, clusterName, start, end]); }, [nodeName, hostName, clusterName, start, end, dotMetricsEnabled]);
const widgetInfo = nodeName ? nodeWidgetInfo : hostWidgetInfo; const widgetInfo = nodeName ? nodeWidgetInfo : hostWidgetInfo;
const queries = useQueries( const queries = useQueries(

View File

@ -8,6 +8,7 @@ import { useResizeObserver } from 'hooks/useDimensions';
import { GetMetricQueryRange } from 'lib/dashboard/getQueryResults'; import { GetMetricQueryRange } from 'lib/dashboard/getQueryResults';
import { getUPlotChartOptions } from 'lib/uPlotLib/getUplotChartOptions'; import { getUPlotChartOptions } from 'lib/uPlotLib/getUplotChartOptions';
import { getUPlotChartData } from 'lib/uPlotLib/utils/getUplotChartData'; import { getUPlotChartData } from 'lib/uPlotLib/utils/getUplotChartData';
import { useAppContext } from 'providers/App/App';
import { useTimezone } from 'providers/Timezone'; import { useTimezone } from 'providers/Timezone';
import { useMemo, useRef } from 'react'; import { useMemo, useRef } from 'react';
import { useQueries, UseQueryResult } from 'react-query'; import { useQueries, UseQueryResult } from 'react-query';
@ -15,6 +16,7 @@ import { SuccessResponse } from 'types/api';
import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange'; import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange';
import uPlot from 'uplot'; import uPlot from 'uplot';
import { FeatureKeys } from '../../../constants/features';
import { getPodQueryPayload, podWidgetInfo } from './constants'; import { getPodQueryPayload, podWidgetInfo } from './constants';
function PodMetrics({ function PodMetrics({
@ -41,9 +43,15 @@ function PodMetrics({
verticalLineTimestamp: logTimestamp.unix(), verticalLineTimestamp: logTimestamp.unix(),
}; };
}, [logLineTimestamp]); }, [logLineTimestamp]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const queryPayloads = useMemo( const queryPayloads = useMemo(
() => getPodQueryPayload(clusterName, podName, start, end), () => getPodQueryPayload(clusterName, podName, start, end, dotMetricsEnabled),
[clusterName, end, podName, start], [clusterName, end, podName, start, dotMetricsEnabled],
); );
const queries = useQueries( const queries = useQueries(
queryPayloads.map((payload) => ({ queryPayloads.map((payload) => ({

View File

@ -21,6 +21,7 @@ export const databaseCallsRPS = ({
servicename, servicename,
legend, legend,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}: DatabaseCallsRPSProps): QueryBuilderData => { }: DatabaseCallsRPSProps): QueryBuilderData => {
const autocompleteData: BaseAutocompleteData[] = [ const autocompleteData: BaseAutocompleteData[] = [
{ {
@ -34,7 +35,7 @@ export const databaseCallsRPS = ({
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
key: 'db_system', key: dotMetricsEnabled ? WidgetKeys.Db_system : WidgetKeys.Db_system_norm,
type: 'tag', type: 'tag',
}, },
]; ];
@ -43,7 +44,9 @@ export const databaseCallsRPS = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Resource, type: MetricsType.Resource,
@ -75,6 +78,7 @@ export const databaseCallsRPS = ({
export const databaseCallsAvgDuration = ({ export const databaseCallsAvgDuration = ({
servicename, servicename,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}: DatabaseCallProps): QueryBuilderData => { }: DatabaseCallProps): QueryBuilderData => {
const autocompleteDataA: BaseAutocompleteData = { const autocompleteDataA: BaseAutocompleteData = {
key: WidgetKeys.SignozDbLatencySum, key: WidgetKeys.SignozDbLatencySum,
@ -93,7 +97,9 @@ export const databaseCallsAvgDuration = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Resource, type: MetricsType.Resource,

View File

@ -33,6 +33,7 @@ export const externalCallErrorPercent = ({
servicename, servicename,
legend, legend,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}: ExternalCallDurationByAddressProps): QueryBuilderData => { }: ExternalCallDurationByAddressProps): QueryBuilderData => {
const autocompleteDataA: BaseAutocompleteData = { const autocompleteDataA: BaseAutocompleteData = {
key: WidgetKeys.SignozExternalCallLatencyCount, key: WidgetKeys.SignozExternalCallLatencyCount,
@ -51,7 +52,9 @@ export const externalCallErrorPercent = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Resource, type: MetricsType.Resource,
@ -62,7 +65,7 @@ export const externalCallErrorPercent = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.StatusCode, key: dotMetricsEnabled ? WidgetKeys.StatusCode : WidgetKeys.StatusCodeNorm,
dataType: DataTypes.Int64, dataType: DataTypes.Int64,
isColumn: false, isColumn: false,
type: MetricsType.Tag, type: MetricsType.Tag,
@ -76,7 +79,9 @@ export const externalCallErrorPercent = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Resource, type: MetricsType.Resource,
@ -121,6 +126,7 @@ export const externalCallErrorPercent = ({
export const externalCallDuration = ({ export const externalCallDuration = ({
servicename, servicename,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}: ExternalCallProps): QueryBuilderData => { }: ExternalCallProps): QueryBuilderData => {
const autocompleteDataA: BaseAutocompleteData = { const autocompleteDataA: BaseAutocompleteData = {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
@ -144,7 +150,9 @@ export const externalCallDuration = ({
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
type: MetricsType.Resource, type: MetricsType.Resource,
}, },
op: OPERATORS.IN, op: OPERATORS.IN,
@ -184,6 +192,7 @@ export const externalCallRpsByAddress = ({
servicename, servicename,
legend, legend,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}: ExternalCallDurationByAddressProps): QueryBuilderData => { }: ExternalCallDurationByAddressProps): QueryBuilderData => {
const autocompleteData: BaseAutocompleteData[] = [ const autocompleteData: BaseAutocompleteData[] = [
{ {
@ -200,7 +209,9 @@ export const externalCallRpsByAddress = ({
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
type: MetricsType.Resource, type: MetricsType.Resource,
}, },
op: OPERATORS.IN, op: OPERATORS.IN,
@ -231,6 +242,7 @@ export const externalCallDurationByAddress = ({
servicename, servicename,
legend, legend,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}: ExternalCallDurationByAddressProps): QueryBuilderData => { }: ExternalCallDurationByAddressProps): QueryBuilderData => {
const autocompleteDataA: BaseAutocompleteData = { const autocompleteDataA: BaseAutocompleteData = {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
@ -253,7 +265,9 @@ export const externalCallDurationByAddress = ({
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
type: MetricsType.Resource, type: MetricsType.Resource,
}, },
op: OPERATORS.IN, op: OPERATORS.IN,

View File

@ -37,10 +37,18 @@ export const latency = ({
tagFilterItems, tagFilterItems,
isSpanMetricEnable = false, isSpanMetricEnable = false,
topLevelOperationsRoute, topLevelOperationsRoute,
dotMetricsEnabled,
}: LatencyProps): QueryBuilderData => { }: LatencyProps): QueryBuilderData => {
const signozLatencyBucketMetrics = dotMetricsEnabled
? WidgetKeys.Signoz_latency_bucket
: WidgetKeys.Signoz_latency_bucket_norm;
const signozMetricsServiceName = dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm;
const newAutoCompleteData: BaseAutocompleteData = { const newAutoCompleteData: BaseAutocompleteData = {
key: isSpanMetricEnable key: isSpanMetricEnable
? WidgetKeys.Signoz_latency_bucket ? signozLatencyBucketMetrics
: WidgetKeys.DurationNano, : WidgetKeys.DurationNano,
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
isColumn: true, isColumn: true,
@ -53,7 +61,7 @@ export const latency = ({
{ {
id: '', id: '',
key: { key: {
key: isSpanMetricEnable ? WidgetKeys.Service_name : WidgetKeys.ServiceName, key: isSpanMetricEnable ? signozMetricsServiceName : WidgetKeys.ServiceName,
dataType: DataTypes.String, dataType: DataTypes.String,
type: isSpanMetricEnable ? MetricsType.Resource : MetricsType.Tag, type: isSpanMetricEnable ? MetricsType.Resource : MetricsType.Tag,
isColumn: !isSpanMetricEnable, isColumn: !isSpanMetricEnable,
@ -295,23 +303,30 @@ export const apDexMetricsQueryBuilderQueries = ({
threashold, threashold,
delta, delta,
metricsBuckets, metricsBuckets,
dotMetricsEnabled,
}: ApDexMetricsQueryBuilderQueriesProps): QueryBuilderData => { }: ApDexMetricsQueryBuilderQueriesProps): QueryBuilderData => {
const autoCompleteDataA: BaseAutocompleteData = { const autoCompleteDataA: BaseAutocompleteData = {
key: WidgetKeys.SignozLatencyCount, key: dotMetricsEnabled
? WidgetKeys.SignozLatencyCount
: WidgetKeys.SignozLatencyCountNorm,
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
isColumn: true, isColumn: true,
type: '', type: '',
}; };
const autoCompleteDataB: BaseAutocompleteData = { const autoCompleteDataB: BaseAutocompleteData = {
key: WidgetKeys.Signoz_latency_bucket, key: dotMetricsEnabled
? WidgetKeys.Signoz_latency_bucket
: WidgetKeys.Signoz_latency_bucket_norm,
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
isColumn: true, isColumn: true,
type: '', type: '',
}; };
const autoCompleteDataC: BaseAutocompleteData = { const autoCompleteDataC: BaseAutocompleteData = {
key: WidgetKeys.Signoz_latency_bucket, key: dotMetricsEnabled
? WidgetKeys.Signoz_latency_bucket
: WidgetKeys.Signoz_latency_bucket_norm,
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
isColumn: true, isColumn: true,
type: '', type: '',
@ -321,7 +336,9 @@ export const apDexMetricsQueryBuilderQueries = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Tag, type: MetricsType.Tag,
@ -347,7 +364,7 @@ export const apDexMetricsQueryBuilderQueries = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.StatusCode, key: dotMetricsEnabled ? WidgetKeys.StatusCode : WidgetKeys.StatusCodeNorm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Tag, type: MetricsType.Tag,
@ -369,7 +386,9 @@ export const apDexMetricsQueryBuilderQueries = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Tag, type: MetricsType.Tag,
@ -406,7 +425,7 @@ export const apDexMetricsQueryBuilderQueries = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.StatusCode, key: dotMetricsEnabled ? WidgetKeys.StatusCode : WidgetKeys.StatusCodeNorm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Tag, type: MetricsType.Tag,
@ -417,7 +436,9 @@ export const apDexMetricsQueryBuilderQueries = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Tag, type: MetricsType.Tag,
@ -482,10 +503,13 @@ export const operationPerSec = ({
servicename, servicename,
tagFilterItems, tagFilterItems,
topLevelOperations, topLevelOperations,
dotMetricsEnabled,
}: OperationPerSecProps): QueryBuilderData => { }: OperationPerSecProps): QueryBuilderData => {
const autocompleteData: BaseAutocompleteData[] = [ const autocompleteData: BaseAutocompleteData[] = [
{ {
key: WidgetKeys.SignozLatencyCount, key: dotMetricsEnabled
? WidgetKeys.SignozLatencyCount
: WidgetKeys.SignozLatencyCountNorm,
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
isColumn: true, isColumn: true,
type: '', type: '',
@ -497,7 +521,9 @@ export const operationPerSec = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Resource, type: MetricsType.Resource,
@ -540,6 +566,7 @@ export const errorPercentage = ({
servicename, servicename,
tagFilterItems, tagFilterItems,
topLevelOperations, topLevelOperations,
dotMetricsEnabled,
}: OperationPerSecProps): QueryBuilderData => { }: OperationPerSecProps): QueryBuilderData => {
const autocompleteDataA: BaseAutocompleteData = { const autocompleteDataA: BaseAutocompleteData = {
key: WidgetKeys.SignozCallsTotal, key: WidgetKeys.SignozCallsTotal,
@ -560,7 +587,9 @@ export const errorPercentage = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Resource, type: MetricsType.Resource,
@ -582,7 +611,9 @@ export const errorPercentage = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.StatusCode, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.StatusCodeNorm,
dataType: DataTypes.Int64, dataType: DataTypes.Int64,
isColumn: false, isColumn: false,
type: MetricsType.Tag, type: MetricsType.Tag,
@ -597,7 +628,9 @@ export const errorPercentage = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Resource, type: MetricsType.Resource,

View File

@ -21,9 +21,12 @@ import { getQueryBuilderQuerieswithFormula } from './MetricsPageQueriesFactory';
export const topOperationQueries = ({ export const topOperationQueries = ({
servicename, servicename,
dotMetricsEnabled,
}: TopOperationQueryFactoryProps): QueryBuilderData => { }: TopOperationQueryFactoryProps): QueryBuilderData => {
const latencyAutoCompleteData: BaseAutocompleteData = { const latencyAutoCompleteData: BaseAutocompleteData = {
key: WidgetKeys.Signoz_latency_bucket, key: dotMetricsEnabled
? WidgetKeys.Signoz_latency_bucket
: WidgetKeys.Signoz_latency_bucket_norm,
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
isColumn: true, isColumn: true,
type: '', type: '',
@ -37,7 +40,9 @@ export const topOperationQueries = ({
}; };
const numOfCallAutoCompleteData: BaseAutocompleteData = { const numOfCallAutoCompleteData: BaseAutocompleteData = {
key: WidgetKeys.SignozLatencyCount, key: dotMetricsEnabled
? WidgetKeys.SignozLatencyCount
: WidgetKeys.SignozLatencyCountNorm,
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
isColumn: true, isColumn: true,
type: '', type: '',
@ -47,7 +52,9 @@ export const topOperationQueries = ({
{ {
id: '', id: '',
key: { key: {
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
type: MetricsType.Resource, type: MetricsType.Resource,
@ -63,7 +70,9 @@ export const topOperationQueries = ({
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
type: MetricsType.Resource, type: MetricsType.Resource,
}, },
op: OPERATORS.IN, op: OPERATORS.IN,
@ -74,7 +83,7 @@ export const topOperationQueries = ({
key: { key: {
dataType: DataTypes.Int64, dataType: DataTypes.Int64,
isColumn: false, isColumn: false,
key: WidgetKeys.StatusCode, key: dotMetricsEnabled ? WidgetKeys.StatusCode : WidgetKeys.StatusCodeNorm,
type: MetricsType.Tag, type: MetricsType.Tag,
}, },
op: OPERATORS.IN, op: OPERATORS.IN,

View File

@ -11,6 +11,7 @@ import {
import useResourceAttribute from 'hooks/useResourceAttribute'; import useResourceAttribute from 'hooks/useResourceAttribute';
import { import {
convertRawQueriesToTraceSelectedTags, convertRawQueriesToTraceSelectedTags,
getResourceDeploymentKeys,
resourceAttributesToTagFilterItems, resourceAttributesToTagFilterItems,
} from 'hooks/useResourceAttribute/utils'; } from 'hooks/useResourceAttribute/utils';
import { useSafeNavigate } from 'hooks/useSafeNavigate'; import { useSafeNavigate } from 'hooks/useSafeNavigate';
@ -26,6 +27,8 @@ import { TagFilterItem } from 'types/api/queryBuilder/queryBuilderData';
import { EQueryType } from 'types/common/dashboard'; import { EQueryType } from 'types/common/dashboard';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { GraphTitle, MENU_ITEMS, SERVICE_CHART_ID } from '../constant'; import { GraphTitle, MENU_ITEMS, SERVICE_CHART_ID } from '../constant';
import { getWidgetQueryBuilder } from '../MetricsApplication.factory'; import { getWidgetQueryBuilder } from '../MetricsApplication.factory';
import { Card, GraphContainer, Row } from '../styles'; import { Card, GraphContainer, Row } from '../styles';
@ -80,7 +83,12 @@ function DBCall(): JSX.Element {
[queries], [queries],
); );
const legend = '{{db_system}}'; const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const legend = dotMetricsEnabled ? '{{db.system}}' : '{{db_system}}';
const databaseCallsRPSWidget = useMemo( const databaseCallsRPSWidget = useMemo(
() => () =>
@ -92,6 +100,7 @@ function DBCall(): JSX.Element {
servicename, servicename,
legend, legend,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}), }),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
@ -102,7 +111,7 @@ function DBCall(): JSX.Element {
id: SERVICE_CHART_ID.dbCallsRPS, id: SERVICE_CHART_ID.dbCallsRPS,
fillSpans: false, fillSpans: false,
}), }),
[servicename, tagFilterItems], [servicename, tagFilterItems, dotMetricsEnabled, legend],
); );
const databaseCallsAverageDurationWidget = useMemo( const databaseCallsAverageDurationWidget = useMemo(
() => () =>
@ -113,6 +122,7 @@ function DBCall(): JSX.Element {
builder: databaseCallsAvgDuration({ builder: databaseCallsAvgDuration({
servicename, servicename,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}), }),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
@ -123,7 +133,7 @@ function DBCall(): JSX.Element {
id: GraphTitle.DATABASE_CALLS_AVG_DURATION, id: GraphTitle.DATABASE_CALLS_AVG_DURATION,
fillSpans: true, fillSpans: true,
}), }),
[servicename, tagFilterItems], [servicename, tagFilterItems, dotMetricsEnabled],
); );
const stepInterval = useMemo( const stepInterval = useMemo(
@ -141,7 +151,7 @@ function DBCall(): JSX.Element {
useEffect(() => { useEffect(() => {
if (!logEventCalledRef.current) { if (!logEventCalledRef.current) {
const selectedEnvironments = queries.find( const selectedEnvironments = queries.find(
(val) => val.tagKey === 'resource_deployment_environment', (val) => val.tagKey === getResourceDeploymentKeys(dotMetricsEnabled),
)?.tagValue; )?.tagValue;
logEvent('APM: Service detail page visited', { logEvent('APM: Service detail page visited', {

View File

@ -13,6 +13,7 @@ import {
import useResourceAttribute from 'hooks/useResourceAttribute'; import useResourceAttribute from 'hooks/useResourceAttribute';
import { import {
convertRawQueriesToTraceSelectedTags, convertRawQueriesToTraceSelectedTags,
getResourceDeploymentKeys,
resourceAttributesToTagFilterItems, resourceAttributesToTagFilterItems,
} from 'hooks/useResourceAttribute/utils'; } from 'hooks/useResourceAttribute/utils';
import { useSafeNavigate } from 'hooks/useSafeNavigate'; import { useSafeNavigate } from 'hooks/useSafeNavigate';
@ -28,6 +29,8 @@ import { DataTypes } from 'types/api/queryBuilder/queryAutocompleteResponse';
import { EQueryType } from 'types/common/dashboard'; import { EQueryType } from 'types/common/dashboard';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { GraphTitle, legend, MENU_ITEMS } from '../constant'; import { GraphTitle, legend, MENU_ITEMS } from '../constant';
import { getWidgetQueryBuilder } from '../MetricsApplication.factory'; import { getWidgetQueryBuilder } from '../MetricsApplication.factory';
import { Card, GraphContainer, Row } from '../styles'; import { Card, GraphContainer, Row } from '../styles';
@ -75,6 +78,10 @@ function External(): JSX.Element {
handleNonInQueryRange(resourceAttributesToTagFilterItems(queries)) || [], handleNonInQueryRange(resourceAttributesToTagFilterItems(queries)) || [],
[queries], [queries],
); );
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const externalCallErrorWidget = useMemo( const externalCallErrorWidget = useMemo(
() => () =>
@ -86,6 +93,7 @@ function External(): JSX.Element {
servicename, servicename,
legend: legend.address, legend: legend.address,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}), }),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
@ -95,7 +103,7 @@ function External(): JSX.Element {
yAxisUnit: '%', yAxisUnit: '%',
id: GraphTitle.EXTERNAL_CALL_ERROR_PERCENTAGE, id: GraphTitle.EXTERNAL_CALL_ERROR_PERCENTAGE,
}), }),
[servicename, tagFilterItems], [servicename, tagFilterItems, dotMetricsEnabled],
); );
const selectedTraceTags = useMemo( const selectedTraceTags = useMemo(
@ -112,6 +120,7 @@ function External(): JSX.Element {
builder: externalCallDuration({ builder: externalCallDuration({
servicename, servicename,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}), }),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
@ -122,7 +131,7 @@ function External(): JSX.Element {
id: GraphTitle.EXTERNAL_CALL_DURATION, id: GraphTitle.EXTERNAL_CALL_DURATION,
fillSpans: true, fillSpans: true,
}), }),
[servicename, tagFilterItems], [servicename, tagFilterItems, dotMetricsEnabled],
); );
const errorApmToTraceQuery = useGetAPMToTracesQueries({ const errorApmToTraceQuery = useGetAPMToTracesQueries({
@ -158,7 +167,7 @@ function External(): JSX.Element {
useEffect(() => { useEffect(() => {
if (!logEventCalledRef.current) { if (!logEventCalledRef.current) {
const selectedEnvironments = queries.find( const selectedEnvironments = queries.find(
(val) => val.tagKey === 'resource_deployment_environment', (val) => val.tagKey === getResourceDeploymentKeys(dotMetricsEnabled),
)?.tagValue; )?.tagValue;
logEvent('APM: Service detail page visited', { logEvent('APM: Service detail page visited', {
@ -181,6 +190,7 @@ function External(): JSX.Element {
servicename, servicename,
legend: legend.address, legend: legend.address,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}), }),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
@ -191,7 +201,7 @@ function External(): JSX.Element {
id: GraphTitle.EXTERNAL_CALL_RPS_BY_ADDRESS, id: GraphTitle.EXTERNAL_CALL_RPS_BY_ADDRESS,
fillSpans: true, fillSpans: true,
}), }),
[servicename, tagFilterItems], [servicename, tagFilterItems, dotMetricsEnabled],
); );
const externalCallDurationAddressWidget = useMemo( const externalCallDurationAddressWidget = useMemo(
@ -204,6 +214,7 @@ function External(): JSX.Element {
servicename, servicename,
legend: legend.address, legend: legend.address,
tagFilterItems, tagFilterItems,
dotMetricsEnabled,
}), }),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
@ -214,7 +225,7 @@ function External(): JSX.Element {
id: GraphTitle.EXTERNAL_CALL_DURATION_BY_ADDRESS, id: GraphTitle.EXTERNAL_CALL_DURATION_BY_ADDRESS,
fillSpans: true, fillSpans: true,
}), }),
[servicename, tagFilterItems], [servicename, tagFilterItems, dotMetricsEnabled],
); );
const apmToTraceQuery = useGetAPMToTracesQueries({ const apmToTraceQuery = useGetAPMToTracesQueries({

View File

@ -11,6 +11,7 @@ import { getQueryString } from 'container/SideNav/helper';
import useResourceAttribute from 'hooks/useResourceAttribute'; import useResourceAttribute from 'hooks/useResourceAttribute';
import { import {
convertRawQueriesToTraceSelectedTags, convertRawQueriesToTraceSelectedTags,
getResourceDeploymentKeys,
resourceAttributesToTagFilterItems, resourceAttributesToTagFilterItems,
} from 'hooks/useResourceAttribute/utils'; } from 'hooks/useResourceAttribute/utils';
import { useSafeNavigate } from 'hooks/useSafeNavigate'; import { useSafeNavigate } from 'hooks/useSafeNavigate';
@ -92,12 +93,15 @@ function Application(): JSX.Element {
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
[handleSetTimeStamp], [handleSetTimeStamp],
); );
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const logEventCalledRef = useRef(false); const logEventCalledRef = useRef(false);
useEffect(() => { useEffect(() => {
if (!logEventCalledRef.current) { if (!logEventCalledRef.current) {
const selectedEnvironments = queries.find( const selectedEnvironments = queries.find(
(val) => val.tagKey === 'resource_deployment_environment', (val) => val.tagKey === getResourceDeploymentKeys(dotMetricsEnabled),
)?.tagValue; )?.tagValue;
logEvent('APM: Service detail page visited', { logEvent('APM: Service detail page visited', {
@ -155,6 +159,7 @@ function Application(): JSX.Element {
servicename, servicename,
tagFilterItems, tagFilterItems,
topLevelOperations: topLevelOperationsRoute, topLevelOperations: topLevelOperationsRoute,
dotMetricsEnabled,
}), }),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
@ -164,7 +169,7 @@ function Application(): JSX.Element {
yAxisUnit: 'ops', yAxisUnit: 'ops',
id: SERVICE_CHART_ID.rps, id: SERVICE_CHART_ID.rps,
}), }),
[servicename, tagFilterItems, topLevelOperationsRoute], [servicename, tagFilterItems, topLevelOperationsRoute, dotMetricsEnabled],
); );
const errorPercentageWidget = useMemo( const errorPercentageWidget = useMemo(
@ -177,6 +182,7 @@ function Application(): JSX.Element {
servicename, servicename,
tagFilterItems, tagFilterItems,
topLevelOperations: topLevelOperationsRoute, topLevelOperations: topLevelOperationsRoute,
dotMetricsEnabled,
}), }),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
@ -187,7 +193,7 @@ function Application(): JSX.Element {
id: SERVICE_CHART_ID.errorPercentage, id: SERVICE_CHART_ID.errorPercentage,
fillSpans: true, fillSpans: true,
}), }),
[servicename, tagFilterItems, topLevelOperationsRoute], [servicename, tagFilterItems, topLevelOperationsRoute, dotMetricsEnabled],
); );
const stepInterval = useMemo( const stepInterval = useMemo(

View File

@ -20,6 +20,8 @@ import { useParams } from 'react-router-dom';
import { EQueryType } from 'types/common/dashboard'; import { EQueryType } from 'types/common/dashboard';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import { FeatureKeys } from '../../../../../constants/features';
import { useAppContext } from '../../../../../providers/App/App';
import { IServiceName } from '../../types'; import { IServiceName } from '../../types';
import { ApDexMetricsProps } from './types'; import { ApDexMetricsProps } from './types';
@ -34,7 +36,10 @@ function ApDexMetrics({
}: ApDexMetricsProps): JSX.Element { }: ApDexMetricsProps): JSX.Element {
const { servicename: encodedServiceName } = useParams<IServiceName>(); const { servicename: encodedServiceName } = useParams<IServiceName>();
const servicename = decodeURIComponent(encodedServiceName); const servicename = decodeURIComponent(encodedServiceName);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const apDexMetricsWidget = useMemo( const apDexMetricsWidget = useMemo(
() => () =>
getWidgetQueryBuilder({ getWidgetQueryBuilder({
@ -48,6 +53,7 @@ function ApDexMetrics({
threashold: thresholdValue || 0, threashold: thresholdValue || 0,
delta: delta || false, delta: delta || false,
metricsBuckets: metricsBuckets || [], metricsBuckets: metricsBuckets || [],
dotMetricsEnabled,
}), }),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
@ -73,6 +79,7 @@ function ApDexMetrics({
tagFilterItems, tagFilterItems,
thresholdValue, thresholdValue,
topLevelOperationsRoute, topLevelOperationsRoute,
dotMetricsEnabled,
], ],
); );

View File

@ -56,6 +56,10 @@ function ServiceOverview({
[isSpanMetricEnable, queries], [isSpanMetricEnable, queries],
); );
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const latencyWidget = useMemo( const latencyWidget = useMemo(
() => () =>
getWidgetQueryBuilder({ getWidgetQueryBuilder({
@ -67,6 +71,7 @@ function ServiceOverview({
tagFilterItems, tagFilterItems,
isSpanMetricEnable, isSpanMetricEnable,
topLevelOperationsRoute, topLevelOperationsRoute,
dotMetricsEnabled,
}), }),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
@ -76,7 +81,13 @@ function ServiceOverview({
yAxisUnit: 'ns', yAxisUnit: 'ns',
id: SERVICE_CHART_ID.latency, id: SERVICE_CHART_ID.latency,
}), }),
[isSpanMetricEnable, servicename, tagFilterItems, topLevelOperationsRoute], [
isSpanMetricEnable,
servicename,
tagFilterItems,
topLevelOperationsRoute,
dotMetricsEnabled,
],
); );
const isQueryEnabled = const isQueryEnabled =

View File

@ -18,6 +18,8 @@ import { EQueryType } from 'types/common/dashboard';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import { FeatureKeys } from '../../../../constants/features';
import { useAppContext } from '../../../../providers/App/App';
import { IServiceName } from '../types'; import { IServiceName } from '../types';
import { title } from './config'; import { title } from './config';
import ColumnWithLink from './TableRenderer/ColumnWithLink'; import ColumnWithLink from './TableRenderer/ColumnWithLink';
@ -40,6 +42,11 @@ function TopOperationMetrics(): JSX.Element {
convertRawQueriesToTraceSelectedTags(queries) || [], convertRawQueriesToTraceSelectedTags(queries) || [],
); );
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const keyOperationWidget = useMemo( const keyOperationWidget = useMemo(
() => () =>
getWidgetQueryBuilder({ getWidgetQueryBuilder({
@ -48,13 +55,14 @@ function TopOperationMetrics(): JSX.Element {
promql: [], promql: [],
builder: topOperationQueries({ builder: topOperationQueries({
servicename, servicename,
dotMetricsEnabled,
}), }),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
}, },
panelTypes: PANEL_TYPES.TABLE, panelTypes: PANEL_TYPES.TABLE,
}), }),
[servicename], [servicename, dotMetricsEnabled],
); );
const updatedQuery = useStepInterval(keyOperationWidget.query); const updatedQuery = useStepInterval(keyOperationWidget.query);

View File

@ -10,6 +10,7 @@ export interface IServiceName {
export interface TopOperationQueryFactoryProps { export interface TopOperationQueryFactoryProps {
servicename: IServiceName['servicename']; servicename: IServiceName['servicename'];
dotMetricsEnabled: boolean;
} }
export interface ExternalCallDurationByAddressProps extends ExternalCallProps { export interface ExternalCallDurationByAddressProps extends ExternalCallProps {
@ -19,6 +20,7 @@ export interface ExternalCallDurationByAddressProps extends ExternalCallProps {
export interface ExternalCallProps { export interface ExternalCallProps {
servicename: IServiceName['servicename']; servicename: IServiceName['servicename'];
tagFilterItems: TagFilterItem[]; tagFilterItems: TagFilterItem[];
dotMetricsEnabled: boolean;
} }
export interface BuilderQueriesProps { export interface BuilderQueriesProps {
@ -50,6 +52,7 @@ export interface OperationPerSecProps {
servicename: IServiceName['servicename']; servicename: IServiceName['servicename'];
tagFilterItems: TagFilterItem[]; tagFilterItems: TagFilterItem[];
topLevelOperations: string[]; topLevelOperations: string[];
dotMetricsEnabled: boolean;
} }
export interface LatencyProps { export interface LatencyProps {
@ -57,6 +60,7 @@ export interface LatencyProps {
tagFilterItems: TagFilterItem[]; tagFilterItems: TagFilterItem[];
isSpanMetricEnable?: boolean; isSpanMetricEnable?: boolean;
topLevelOperationsRoute: string[]; topLevelOperationsRoute: string[];
dotMetricsEnabled: boolean;
} }
export interface ApDexProps { export interface ApDexProps {
@ -74,4 +78,5 @@ export interface TableRendererProps {
export interface ApDexMetricsQueryBuilderQueriesProps extends ApDexProps { export interface ApDexMetricsQueryBuilderQueriesProps extends ApDexProps {
delta: boolean; delta: boolean;
metricsBuckets: number[]; metricsBuckets: number[];
dotMetricsEnabled: boolean;
} }

View File

@ -85,12 +85,15 @@ export enum WidgetKeys {
HasError = 'hasError', HasError = 'hasError',
Address = 'address', Address = 'address',
DurationNano = 'durationNano', DurationNano = 'durationNano',
StatusCode = 'status_code', StatusCodeNorm = 'status_code',
StatusCode = 'status.code',
Operation = 'operation', Operation = 'operation',
OperationName = 'operationName', OperationName = 'operationName',
Service_name = 'service_name', Service_name_norm = 'service_name',
Service_name = 'service.name',
ServiceName = 'serviceName', ServiceName = 'serviceName',
SignozLatencyCount = 'signoz_latency_count', SignozLatencyCountNorm = 'signoz_latency_count',
SignozLatencyCount = 'signoz_latency.count',
SignozDBLatencyCount = 'signoz_db_latency_count', SignozDBLatencyCount = 'signoz_db_latency_count',
DatabaseCallCount = 'signoz_database_call_count', DatabaseCallCount = 'signoz_database_call_count',
DatabaseCallLatencySum = 'signoz_database_call_latency_sum', DatabaseCallLatencySum = 'signoz_database_call_latency_sum',
@ -98,7 +101,10 @@ export enum WidgetKeys {
SignozCallsTotal = 'signoz_calls_total', SignozCallsTotal = 'signoz_calls_total',
SignozExternalCallLatencyCount = 'signoz_external_call_latency_count', SignozExternalCallLatencyCount = 'signoz_external_call_latency_count',
SignozExternalCallLatencySum = 'signoz_external_call_latency_sum', SignozExternalCallLatencySum = 'signoz_external_call_latency_sum',
Signoz_latency_bucket = 'signoz_latency_bucket', Signoz_latency_bucket_norm = 'signoz_latency_bucket',
Signoz_latency_bucket = 'signoz_latency.bucket',
Db_system = 'db.system',
Db_system_norm = 'db_system',
} }
export const topOperationMetricsDownloadOptions: DownloadOptions = { export const topOperationMetricsDownloadOptions: DownloadOptions = {

View File

@ -25,10 +25,11 @@ export interface NavigateToTraceProps {
} }
export interface DatabaseCallsRPSProps extends DatabaseCallProps { export interface DatabaseCallsRPSProps extends DatabaseCallProps {
legend: '{{db_system}}'; legend: string;
} }
export interface DatabaseCallProps { export interface DatabaseCallProps {
servicename: IServiceName['servicename']; servicename: IServiceName['servicename'];
tagFilterItems: TagFilterItem[]; tagFilterItems: TagFilterItem[];
dotMetricsEnabled: boolean;
} }

View File

@ -5,11 +5,13 @@ import { InspectMetricsSeries } from 'api/metricsExplorer/getInspectMetricsDetai
import { MetricType } from 'api/metricsExplorer/getMetricsList'; import { MetricType } from 'api/metricsExplorer/getMetricsList';
import * as useInspectMetricsHooks from 'hooks/metricsExplorer/useGetInspectMetricsDetails'; import * as useInspectMetricsHooks from 'hooks/metricsExplorer/useGetInspectMetricsDetails';
import * as useGetMetricDetailsHooks from 'hooks/metricsExplorer/useGetMetricDetails'; import * as useGetMetricDetailsHooks from 'hooks/metricsExplorer/useGetMetricDetails';
import * as appContextHooks from 'providers/App/App';
import { QueryClient, QueryClientProvider } from 'react-query'; import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import store from 'store'; import store from 'store';
import ROUTES from '../../../../constants/routes'; import ROUTES from '../../../../constants/routes';
import { LicenseEvent } from '../../../../types/api/licensesV3/getActive';
import Inspect from '../Inspect'; import Inspect from '../Inspect';
import { InspectionStep } from '../types'; import { InspectionStep } from '../types';
@ -27,6 +29,30 @@ const mockTimeSeries: InspectMetricsSeries[] = [
}, },
]; ];
jest.spyOn(appContextHooks, 'useAppContext').mockReturnValue({
user: {
role: 'admin',
},
activeLicenseV3: {
event_queue: {
created_at: '0',
event: LicenseEvent.NO_EVENT,
scheduled_at: '0',
status: '',
updated_at: '0',
},
license: {
license_key: 'test-license-key',
license_type: 'trial',
org_id: 'test-org-id',
plan_id: 'test-plan-id',
plan_name: 'test-plan-name',
plan_type: 'trial',
plan_version: 'test-plan-version',
},
},
} as any);
jest.spyOn(useGetMetricDetailsHooks, 'useGetMetricDetails').mockReturnValue({ jest.spyOn(useGetMetricDetailsHooks, 'useGetMetricDetails').mockReturnValue({
data: { data: {
metricDetails: { metricDetails: {

View File

@ -1,11 +1,13 @@
/* eslint-disable react/jsx-props-no-spreading */ /* eslint-disable react/jsx-props-no-spreading */
import { render, screen } from '@testing-library/react'; import { render, screen } from '@testing-library/react';
import { MetricType } from 'api/metricsExplorer/getMetricsList'; import { MetricType } from 'api/metricsExplorer/getMetricsList';
import * as appContextHooks from 'providers/App/App';
import { QueryClient, QueryClientProvider } from 'react-query'; import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import store from 'store'; import store from 'store';
import ROUTES from '../../../../constants/routes'; import ROUTES from '../../../../constants/routes';
import { LicenseEvent } from '../../../../types/api/licensesV3/getActive';
import QueryBuilder from '../QueryBuilder'; import QueryBuilder from '../QueryBuilder';
import { import {
InspectionStep, InspectionStep,
@ -20,6 +22,30 @@ jest.mock('react-router-dom', () => ({
}), }),
})); }));
jest.spyOn(appContextHooks, 'useAppContext').mockReturnValue({
user: {
role: 'admin',
},
activeLicenseV3: {
event_queue: {
created_at: '0',
event: LicenseEvent.NO_EVENT,
scheduled_at: '0',
status: '',
updated_at: '0',
},
license: {
license_key: 'test-license-key',
license_type: 'trial',
org_id: 'test-org-id',
plan_id: 'test-plan-id',
plan_name: 'test-plan-name',
plan_type: 'trial',
plan_version: 'test-plan-version',
},
},
} as any);
const queryClient = new QueryClient(); const queryClient = new QueryClient();
describe('QueryBuilder', () => { describe('QueryBuilder', () => {

View File

@ -1,12 +0,0 @@
import * as Sentry from '@sentry/react';
import ErrorBoundaryFallback from 'pages/ErrorBoundaryFallback/ErrorBoundaryFallback';
function Views(): JSX.Element {
return (
<Sentry.ErrorBoundary fallback={<ErrorBoundaryFallback />}>
Views
</Sentry.ErrorBoundary>
);
}
export default Views;

View File

@ -1,3 +0,0 @@
import Views from './Views';
export default Views;

View File

@ -1,6 +1,6 @@
import { Button, Divider, Form, Modal } from 'antd'; import { Button, Divider, Form, FormInstance, Modal } from 'antd';
import { useAppContext } from 'providers/App/App'; import { useAppContext } from 'providers/App/App';
import React, { useCallback, useEffect, useMemo } from 'react'; import React, { useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ActionMode, ActionType, PipelineData } from 'types/api/pipeline/def'; import { ActionMode, ActionType, PipelineData } from 'types/api/pipeline/def';
import { v4 } from 'uuid'; import { v4 } from 'uuid';
@ -10,6 +10,7 @@ import { getEditedDataSource, getRecordIndex } from '../utils';
import { renderPipelineForm } from './utils'; import { renderPipelineForm } from './utils';
function AddNewPipeline({ function AddNewPipeline({
form,
isActionType, isActionType,
setActionType, setActionType,
selectedPipelineData, selectedPipelineData,
@ -17,22 +18,12 @@ function AddNewPipeline({
setCurrPipelineData, setCurrPipelineData,
currPipelineData, currPipelineData,
}: AddNewPipelineProps): JSX.Element { }: AddNewPipelineProps): JSX.Element {
const [form] = Form.useForm();
const { t } = useTranslation('pipeline'); const { t } = useTranslation('pipeline');
const { user } = useAppContext(); const { user } = useAppContext();
const isEdit = isActionType === 'edit-pipeline'; const isEdit = isActionType === 'edit-pipeline';
const isAdd = isActionType === 'add-pipeline'; const isAdd = isActionType === 'add-pipeline';
useEffect(() => {
if (isEdit) {
form.setFieldsValue(selectedPipelineData);
}
if (isAdd) {
form.resetFields();
}
}, [form, isEdit, isAdd, selectedPipelineData]);
const onFinish = (values: PipelineData): void => { const onFinish = (values: PipelineData): void => {
const newPipeLineData: PipelineData = { const newPipeLineData: PipelineData = {
id: v4(), id: v4(),
@ -135,6 +126,7 @@ function AddNewPipeline({
} }
interface AddNewPipelineProps { interface AddNewPipelineProps {
form: FormInstance<PipelineData>;
isActionType: string; isActionType: string;
setActionType: (actionType?: ActionType) => void; setActionType: (actionType?: ActionType) => void;
selectedPipelineData: PipelineData | undefined; selectedPipelineData: PipelineData | undefined;

View File

@ -1,7 +1,7 @@
import './styles.scss'; import './styles.scss';
import { ExclamationCircleOutlined, PlusOutlined } from '@ant-design/icons'; import { ExclamationCircleOutlined, PlusOutlined } from '@ant-design/icons';
import { Card, Modal, Table, Typography } from 'antd'; import { Card, Form, Modal, Table, Typography } from 'antd';
import { ExpandableConfig } from 'antd/es/table/interface'; import { ExpandableConfig } from 'antd/es/table/interface';
import logEvent from 'api/common/logEvent'; import logEvent from 'api/common/logEvent';
import savePipeline from 'api/pipeline/post'; import savePipeline from 'api/pipeline/post';
@ -95,6 +95,7 @@ function PipelineListsView({
pipelineData, pipelineData,
refetchPipelineLists, refetchPipelineLists,
}: PipelineListsViewProps): JSX.Element { }: PipelineListsViewProps): JSX.Element {
const [pipelineForm] = Form.useForm<PipelineData>();
const { t } = useTranslation(['pipeline', 'common']); const { t } = useTranslation(['pipeline', 'common']);
const [modal, contextHolder] = Modal.useModal(); const [modal, contextHolder] = Modal.useModal();
const { notifications } = useNotifications(); const { notifications } = useNotifications();
@ -179,8 +180,9 @@ function PipelineListsView({
(record: PipelineData) => (): void => { (record: PipelineData) => (): void => {
setActionType(ActionType.EditPipeline); setActionType(ActionType.EditPipeline);
setSelectedPipelineData(record); setSelectedPipelineData(record);
pipelineForm.setFieldsValue(record);
}, },
[setActionType], [setActionType, pipelineForm],
); );
const pipelineDeleteHandler = useCallback( const pipelineDeleteHandler = useCallback(
@ -382,12 +384,13 @@ function PipelineListsView({
const addNewPipelineHandler = useCallback((): void => { const addNewPipelineHandler = useCallback((): void => {
setActionType(ActionType.AddPipeline); setActionType(ActionType.AddPipeline);
pipelineForm.resetFields();
logEvent('Logs: Pipelines: Clicked Add New Pipeline', { logEvent('Logs: Pipelines: Clicked Add New Pipeline', {
source: 'signoz-ui', source: 'signoz-ui',
}); });
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [setActionType]); }, [setActionType, pipelineForm]);
const footer = useCallback((): JSX.Element | undefined => { const footer = useCallback((): JSX.Element | undefined => {
if (isEditingActionMode) { if (isEditingActionMode) {
@ -495,6 +498,7 @@ function PipelineListsView({
<> <>
{contextHolder} {contextHolder}
<AddNewPipeline <AddNewPipeline
form={pipelineForm}
isActionType={isActionType} isActionType={isActionType}
setActionType={setActionType} setActionType={setActionType}
selectedPipelineData={selectedPipelineData} selectedPipelineData={selectedPipelineData}

View File

@ -1,4 +1,6 @@
import { Form } from 'antd';
import { render } from 'tests/test-utils'; import { render } from 'tests/test-utils';
import { PipelineData } from 'types/api/pipeline/def';
import { pipelineMockData } from '../mocks/pipeline'; import { pipelineMockData } from '../mocks/pipeline';
import AddNewPipeline from '../PipelineListsView/AddNewPipeline'; import AddNewPipeline from '../PipelineListsView/AddNewPipeline';
@ -36,13 +38,13 @@ beforeAll(() => {
matchMedia(); matchMedia();
}); });
describe('PipelinePage container test', () => { function AddNewPipelineWrapper(): JSX.Element {
it('should render AddNewPipeline section', () => {
const setActionType = jest.fn(); const setActionType = jest.fn();
const selectedPipelineData = pipelineMockData[0]; const selectedPipelineData = pipelineMockData[0];
const isActionType = 'add-pipeline'; const isActionType = 'add-pipeline';
const [pipelineForm] = Form.useForm<PipelineData>();
const { asFragment } = render( return (
<AddNewPipeline <AddNewPipeline
isActionType={isActionType} isActionType={isActionType}
setActionType={setActionType} setActionType={setActionType}
@ -50,8 +52,14 @@ describe('PipelinePage container test', () => {
setShowSaveButton={jest.fn()} setShowSaveButton={jest.fn()}
setCurrPipelineData={jest.fn()} setCurrPipelineData={jest.fn()}
currPipelineData={pipelineMockData} currPipelineData={pipelineMockData}
/>, form={pipelineForm}
/>
); );
}
describe('PipelinePage container test', () => {
it('should render AddNewPipeline section', () => {
const { asFragment } = render(<AddNewPipelineWrapper />);
expect(asFragment()).toMatchSnapshot(); expect(asFragment()).toMatchSnapshot();
}); });
}); });

View File

@ -1,4 +1,5 @@
/* eslint-disable sonarjs/no-duplicate-string */ /* eslint-disable sonarjs/no-duplicate-string */
import { screen } from '@testing-library/react';
import { findByText, fireEvent, render, waitFor } from 'tests/test-utils'; import { findByText, fireEvent, render, waitFor } from 'tests/test-utils';
import { pipelineApiResponseMockData } from '../mocks/pipeline'; import { pipelineApiResponseMockData } from '../mocks/pipeline';
@ -243,4 +244,34 @@ describe('PipelinePage container test', () => {
expect(saveBtn).toBeInTheDocument(); expect(saveBtn).toBeInTheDocument();
await fireEvent.click(saveBtn); await fireEvent.click(saveBtn);
}); });
it('should have populated form fields when edit pipeline is clicked', async () => {
render(
<PipelineListsView
setActionType={jest.fn()}
isActionMode="editing-mode"
setActionMode={jest.fn()}
pipelineData={pipelineApiResponseMockData}
isActionType="edit-pipeline"
refetchPipelineLists={jest.fn()}
/>,
);
// content assertion
expect(document.querySelectorAll('[data-icon="edit"]').length).toBe(2);
// expand action
const expandIcon = document.querySelectorAll(
'.ant-table-row-expand-icon-cell > span[class*="anticon-right"]',
);
expect(expandIcon.length).toBe(2);
await fireEvent.click(expandIcon[0]);
const editBtn = document.querySelectorAll('[data-icon="edit"]');
// click on edit btn
await fireEvent.click(editBtn[0] as HTMLElement);
// to have length 2
expect(screen.queryAllByText('source = nginx').length).toBe(2);
});
}); });

View File

@ -51,6 +51,8 @@ import { getUserOperatingSystem, UserOperatingSystem } from 'utils/getUserOS';
import { popupContainer } from 'utils/selectPopupContainer'; import { popupContainer } from 'utils/selectPopupContainer';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import { FeatureKeys } from '../../../../constants/features';
import { useAppContext } from '../../../../providers/App/App';
import { selectStyle } from './config'; import { selectStyle } from './config';
import { PLACEHOLDER } from './constant'; import { PLACEHOLDER } from './constant';
import ExampleQueriesRendererForLogs from './ExampleQueriesRendererForLogs'; import ExampleQueriesRendererForLogs from './ExampleQueriesRendererForLogs';
@ -85,6 +87,11 @@ function QueryBuilderSearch({
const [isEditingTag, setIsEditingTag] = useState(false); const [isEditingTag, setIsEditingTag] = useState(false);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const { const {
updateTag, updateTag,
handleClearTag, handleClearTag,
@ -104,6 +111,7 @@ function QueryBuilderSearch({
exampleQueries, exampleQueries,
} = useAutoComplete( } = useAutoComplete(
query, query,
dotMetricsEnabled,
whereClauseConfig, whereClauseConfig,
isLogsExplorerPage, isLogsExplorerPage,
isInfraMonitoring, isInfraMonitoring,
@ -121,6 +129,7 @@ function QueryBuilderSearch({
const { sourceKeys, handleRemoveSourceKey } = useFetchKeysAndValues( const { sourceKeys, handleRemoveSourceKey } = useFetchKeysAndValues(
searchValue, searchValue,
query, query,
dotMetricsEnabled,
searchKey, searchKey,
isLogsExplorerPage, isLogsExplorerPage,
isInfraMonitoring, isInfraMonitoring,

View File

@ -9,12 +9,15 @@ import {
convertMetricKeyToTrace, convertMetricKeyToTrace,
getEnvironmentTagKeys, getEnvironmentTagKeys,
getEnvironmentTagValues, getEnvironmentTagValues,
getResourceDeploymentKeys,
} from 'hooks/useResourceAttribute/utils'; } from 'hooks/useResourceAttribute/utils';
import { ReactNode, useEffect, useMemo, useState } from 'react'; import { ReactNode, useEffect, useMemo, useState } from 'react';
import { SelectOption } from 'types/common/select'; import { SelectOption } from 'types/common/select';
import { popupContainer } from 'utils/selectPopupContainer'; import { popupContainer } from 'utils/selectPopupContainer';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import { FeatureKeys } from '../../constants/features';
import { useAppContext } from '../../providers/App/App';
import QueryChip from './components/QueryChip'; import QueryChip from './components/QueryChip';
import { QueryChipItem, SearchContainer } from './styles'; import { QueryChipItem, SearchContainer } from './styles';
@ -39,24 +42,27 @@ function ResourceAttributesFilter({
SelectOption<string, string>[] SelectOption<string, string>[]
>([]); >([]);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const resourceDeploymentKey = getResourceDeploymentKeys(dotMetricsEnabled);
const [selectedEnvironments, setSelectedEnvironments] = useState<string[]>([]); const [selectedEnvironments, setSelectedEnvironments] = useState<string[]>([]);
const queriesExcludingEnvironment = useMemo( const queriesExcludingEnvironment = useMemo(
() => () => queries.filter((query) => query.tagKey !== resourceDeploymentKey),
queries.filter( [queries, resourceDeploymentKey],
(query) => query.tagKey !== 'resource_deployment_environment',
),
[queries],
); );
const isEmpty = useMemo( const isEmpty = useMemo(
() => isResourceEmpty(queriesExcludingEnvironment, staging, selectedQuery), () => isResourceEmpty(queriesExcludingEnvironment, staging, selectedQuery),
[queriesExcludingEnvironment, selectedQuery, staging], [queriesExcludingEnvironment, selectedQuery, staging],
); );
useEffect(() => { useEffect(() => {
const resourceDeploymentEnvironmentQuery = queries.filter( const resourceDeploymentEnvironmentQuery = queries.filter(
(query) => query.tagKey === 'resource_deployment_environment', (query) => query.tagKey === resourceDeploymentKey,
); );
if (resourceDeploymentEnvironmentQuery?.length > 0) { if (resourceDeploymentEnvironmentQuery?.length > 0) {
@ -64,17 +70,17 @@ function ResourceAttributesFilter({
} else { } else {
setSelectedEnvironments([]); setSelectedEnvironments([]);
} }
}, [queries]); }, [queries, resourceDeploymentKey]);
useEffect(() => { useEffect(() => {
getEnvironmentTagKeys().then((tagKeys) => { getEnvironmentTagKeys(dotMetricsEnabled).then((tagKeys) => {
if (tagKeys && Array.isArray(tagKeys) && tagKeys.length > 0) { if (tagKeys && Array.isArray(tagKeys) && tagKeys.length > 0) {
getEnvironmentTagValues().then((tagValues) => { getEnvironmentTagValues(dotMetricsEnabled).then((tagValues) => {
setEnvironments(tagValues); setEnvironments(tagValues);
}); });
} }
}); });
}, []); }, [dotMetricsEnabled]);
return ( return (
<div className="resourceAttributesFilter-container"> <div className="resourceAttributesFilter-container">

View File

@ -1,5 +1,10 @@
import { convertMetricKeyToTrace } from 'hooks/useResourceAttribute/utils'; import {
convertMetricKeyToTrace,
getResourceDeploymentKeys,
} from 'hooks/useResourceAttribute/utils';
import { FeatureKeys } from '../../../../constants/features';
import { useAppContext } from '../../../../providers/App/App';
import { QueryChipContainer, QueryChipItem } from '../../styles'; import { QueryChipContainer, QueryChipItem } from '../../styles';
import { IQueryChipProps } from './types'; import { IQueryChipProps } from './types';
@ -8,12 +13,17 @@ function QueryChip({ queryData, onClose }: IQueryChipProps): JSX.Element {
onClose(queryData.id); onClose(queryData.id);
}; };
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
return ( return (
<QueryChipContainer> <QueryChipContainer>
<QueryChipItem>{convertMetricKeyToTrace(queryData.tagKey)}</QueryChipItem> <QueryChipItem>{convertMetricKeyToTrace(queryData.tagKey)}</QueryChipItem>
<QueryChipItem>{queryData.operator}</QueryChipItem> <QueryChipItem>{queryData.operator}</QueryChipItem>
<QueryChipItem <QueryChipItem
closable={queryData.tagKey !== 'resource_deployment_environment'} closable={queryData.tagKey !== getResourceDeploymentKeys(dotMetricsEnabled)}
onClose={onCloseHandler} onClose={onCloseHandler}
> >
{queryData.tagValue.join(', ')} {queryData.tagValue.join(', ')}

View File

@ -3,6 +3,8 @@ import { useSelector } from 'react-redux';
import { AppState } from 'store/reducers'; import { AppState } from 'store/reducers';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { ServiceMetricsProps } from '../types'; import { ServiceMetricsProps } from '../types';
import { getQueryRangeRequestData } from '../utils'; import { getQueryRangeRequestData } from '../utils';
import ServiceMetricTable from './ServiceMetricTable'; import ServiceMetricTable from './ServiceMetricTable';
@ -15,6 +17,11 @@ function ServiceMetricsApplication({
GlobalReducer GlobalReducer
>((state) => state.globalTime); >((state) => state.globalTime);
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const queryRangeRequestData = useMemo( const queryRangeRequestData = useMemo(
() => () =>
getQueryRangeRequestData({ getQueryRangeRequestData({
@ -22,8 +29,15 @@ function ServiceMetricsApplication({
minTime, minTime,
maxTime, maxTime,
globalSelectedInterval, globalSelectedInterval,
dotMetricsEnabled,
}), }),
[globalSelectedInterval, maxTime, minTime, topLevelOperations], [
globalSelectedInterval,
maxTime,
minTime,
topLevelOperations,
dotMetricsEnabled,
],
); );
return ( return (
<ServiceMetricTable <ServiceMetricTable

View File

@ -19,11 +19,14 @@ import {
export const serviceMetricsQuery = ( export const serviceMetricsQuery = (
topLevelOperation: [keyof ServiceDataProps, string[]], topLevelOperation: [keyof ServiceDataProps, string[]],
dotMetricsEnabled: boolean,
): QueryBuilderData => { ): QueryBuilderData => {
const p99AutoCompleteData: BaseAutocompleteData = { const p99AutoCompleteData: BaseAutocompleteData = {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
isColumn: true, isColumn: true,
key: WidgetKeys.Signoz_latency_bucket, key: dotMetricsEnabled
? WidgetKeys.Signoz_latency_bucket
: WidgetKeys.Signoz_latency_bucket_norm,
type: '', type: '',
}; };
@ -54,7 +57,9 @@ export const serviceMetricsQuery = (
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
type: MetricsType.Resource, type: MetricsType.Resource,
}, },
op: OPERATORS.IN, op: OPERATORS.IN,
@ -79,7 +84,9 @@ export const serviceMetricsQuery = (
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
type: MetricsType.Resource, type: MetricsType.Resource,
}, },
op: OPERATORS.IN, op: OPERATORS.IN,
@ -90,7 +97,7 @@ export const serviceMetricsQuery = (
key: { key: {
dataType: DataTypes.Int64, dataType: DataTypes.Int64,
isColumn: false, isColumn: false,
key: WidgetKeys.StatusCode, key: dotMetricsEnabled ? WidgetKeys.StatusCode : WidgetKeys.StatusCodeNorm,
type: MetricsType.Tag, type: MetricsType.Tag,
}, },
op: OPERATORS.IN, op: OPERATORS.IN,
@ -115,7 +122,9 @@ export const serviceMetricsQuery = (
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
type: MetricsType.Resource, type: MetricsType.Resource,
}, },
op: OPERATORS.IN, op: OPERATORS.IN,
@ -140,7 +149,9 @@ export const serviceMetricsQuery = (
key: { key: {
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
type: MetricsType.Resource, type: MetricsType.Resource,
}, },
op: OPERATORS.IN, op: OPERATORS.IN,
@ -195,7 +206,9 @@ export const serviceMetricsQuery = (
{ {
dataType: DataTypes.String, dataType: DataTypes.String,
isColumn: false, isColumn: false,
key: WidgetKeys.Service_name, key: dotMetricsEnabled
? WidgetKeys.Service_name
: WidgetKeys.Service_name_norm,
type: MetricsType.Tag, type: MetricsType.Tag,
}, },
]; ];

View File

@ -5,7 +5,10 @@ import { SKIP_ONBOARDING } from 'constants/onboarding';
import useErrorNotification from 'hooks/useErrorNotification'; import useErrorNotification from 'hooks/useErrorNotification';
import { useQueryService } from 'hooks/useQueryService'; import { useQueryService } from 'hooks/useQueryService';
import useResourceAttribute from 'hooks/useResourceAttribute'; import useResourceAttribute from 'hooks/useResourceAttribute';
import { convertRawQueriesToTraceSelectedTags } from 'hooks/useResourceAttribute/utils'; import {
convertRawQueriesToTraceSelectedTags,
getResourceDeploymentKeys,
} from 'hooks/useResourceAttribute/utils';
import { isUndefined } from 'lodash-es'; import { isUndefined } from 'lodash-es';
import { useEffect, useMemo, useRef, useState } from 'react'; import { useEffect, useMemo, useRef, useState } from 'react';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
@ -13,6 +16,8 @@ import { AppState } from 'store/reducers';
import { GlobalReducer } from 'types/reducer/globalTime'; import { GlobalReducer } from 'types/reducer/globalTime';
import { Tags } from 'types/reducer/trace'; import { Tags } from 'types/reducer/trace';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import SkipOnBoardingModal from '../SkipOnBoardModal'; import SkipOnBoardingModal from '../SkipOnBoardModal';
import ServiceTraceTable from './ServiceTracesTable'; import ServiceTraceTable from './ServiceTracesTable';
@ -34,6 +39,11 @@ function ServiceTraces(): JSX.Element {
selectedTags, selectedTags,
}); });
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
useErrorNotification(error); useErrorNotification(error);
const services = data || []; const services = data || [];
@ -51,7 +61,7 @@ function ServiceTraces(): JSX.Element {
useEffect(() => { useEffect(() => {
if (!logEventCalledRef.current && !isUndefined(data)) { if (!logEventCalledRef.current && !isUndefined(data)) {
const selectedEnvironments = queries.find( const selectedEnvironments = queries.find(
(val) => val.tagKey === 'resource_deployment_environment', (val) => val.tagKey === getResourceDeploymentKeys(dotMetricsEnabled),
)?.tagValue; )?.tagValue;
const rps = data.reduce((total, service) => total + service.callRate, 0); const rps = data.reduce((total, service) => total + service.callRate, 0);

View File

@ -29,6 +29,7 @@ export interface GetQueryRangeRequestDataProps {
maxTime: number; maxTime: number;
minTime: number; minTime: number;
globalSelectedInterval: Time | TimeV2 | CustomTimeType; globalSelectedInterval: Time | TimeV2 | CustomTimeType;
dotMetricsEnabled: boolean;
} }
export interface GetServiceListFromQueryProps { export interface GetServiceListFromQueryProps {

View File

@ -28,6 +28,7 @@ export const getQueryRangeRequestData = ({
maxTime, maxTime,
minTime, minTime,
globalSelectedInterval, globalSelectedInterval,
dotMetricsEnabled,
}: GetQueryRangeRequestDataProps): GetQueryResultsProps[] => { }: GetQueryRangeRequestDataProps): GetQueryResultsProps[] => {
const requestData: GetQueryResultsProps[] = []; const requestData: GetQueryResultsProps[] = [];
topLevelOperations.forEach((operation) => { topLevelOperations.forEach((operation) => {
@ -35,7 +36,7 @@ export const getQueryRangeRequestData = ({
query: { query: {
queryType: EQueryType.QUERY_BUILDER, queryType: EQueryType.QUERY_BUILDER,
promql: [], promql: [],
builder: serviceMetricsQuery(operation), builder: serviceMetricsQuery(operation, dotMetricsEnabled),
clickhouse_sql: [], clickhouse_sql: [],
id: uuid(), id: uuid(),
}, },

View File

@ -17,6 +17,7 @@ type UseGetK8sClustersList = (
>, >,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled?: boolean,
) => UseQueryResult< ) => UseQueryResult<
SuccessResponse<K8sClustersListResponse> | ErrorResponse, SuccessResponse<K8sClustersListResponse> | ErrorResponse,
Error Error
@ -28,6 +29,7 @@ export const useGetK8sClustersList: UseGetK8sClustersList = (
options, options,
headers, headers,
dotMetricsEnabled?: boolean,
) => { ) => {
const queryKey = useMemo(() => { const queryKey = useMemo(() => {
if (options?.queryKey && Array.isArray(options.queryKey)) { if (options?.queryKey && Array.isArray(options.queryKey)) {
@ -45,7 +47,8 @@ export const useGetK8sClustersList: UseGetK8sClustersList = (
SuccessResponse<K8sClustersListResponse> | ErrorResponse, SuccessResponse<K8sClustersListResponse> | ErrorResponse,
Error Error
>({ >({
queryFn: ({ signal }) => getK8sClustersList(requestData, signal, headers), queryFn: ({ signal }) =>
getK8sClustersList(requestData, signal, headers, dotMetricsEnabled),
...options, ...options,

View File

@ -17,6 +17,7 @@ type UseGetK8sDaemonSetsList = (
>, >,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled?: boolean,
) => UseQueryResult< ) => UseQueryResult<
SuccessResponse<K8sDaemonSetsListResponse> | ErrorResponse, SuccessResponse<K8sDaemonSetsListResponse> | ErrorResponse,
Error Error
@ -28,6 +29,7 @@ export const useGetK8sDaemonSetsList: UseGetK8sDaemonSetsList = (
options, options,
headers, headers,
dotMetricsEnabled,
) => { ) => {
const queryKey = useMemo(() => { const queryKey = useMemo(() => {
if (options?.queryKey && Array.isArray(options.queryKey)) { if (options?.queryKey && Array.isArray(options.queryKey)) {
@ -45,7 +47,8 @@ export const useGetK8sDaemonSetsList: UseGetK8sDaemonSetsList = (
SuccessResponse<K8sDaemonSetsListResponse> | ErrorResponse, SuccessResponse<K8sDaemonSetsListResponse> | ErrorResponse,
Error Error
>({ >({
queryFn: ({ signal }) => getK8sDaemonSetsList(requestData, signal, headers), queryFn: ({ signal }) =>
getK8sDaemonSetsList(requestData, signal, headers, dotMetricsEnabled),
...options, ...options,

View File

@ -15,6 +15,7 @@ type UseGetK8sDeploymentsList = (
Error Error
>, >,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled?: boolean,
) => UseQueryResult< ) => UseQueryResult<
SuccessResponse<K8sDeploymentsListResponse> | ErrorResponse, SuccessResponse<K8sDeploymentsListResponse> | ErrorResponse,
Error Error
@ -24,6 +25,7 @@ export const useGetK8sDeploymentsList: UseGetK8sDeploymentsList = (
requestData, requestData,
options, options,
headers, headers,
dotMetricsEnabled,
) => { ) => {
const queryKey = useMemo(() => { const queryKey = useMemo(() => {
if (options?.queryKey && Array.isArray(options.queryKey)) { if (options?.queryKey && Array.isArray(options.queryKey)) {
@ -41,7 +43,8 @@ export const useGetK8sDeploymentsList: UseGetK8sDeploymentsList = (
SuccessResponse<K8sDeploymentsListResponse> | ErrorResponse, SuccessResponse<K8sDeploymentsListResponse> | ErrorResponse,
Error Error
>({ >({
queryFn: ({ signal }) => getK8sDeploymentsList(requestData, signal, headers), queryFn: ({ signal }) =>
getK8sDeploymentsList(requestData, signal, headers, dotMetricsEnabled),
...options, ...options,
queryKey, queryKey,
}); });

View File

@ -17,6 +17,7 @@ type UseGetK8sJobsList = (
>, >,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled?: boolean,
) => UseQueryResult< ) => UseQueryResult<
SuccessResponse<K8sJobsListResponse> | ErrorResponse, SuccessResponse<K8sJobsListResponse> | ErrorResponse,
Error Error
@ -28,6 +29,7 @@ export const useGetK8sJobsList: UseGetK8sJobsList = (
options, options,
headers, headers,
dotMetricsEnabled,
) => { ) => {
const queryKey = useMemo(() => { const queryKey = useMemo(() => {
if (options?.queryKey && Array.isArray(options.queryKey)) { if (options?.queryKey && Array.isArray(options.queryKey)) {
@ -42,7 +44,8 @@ export const useGetK8sJobsList: UseGetK8sJobsList = (
}, [options?.queryKey, requestData]); }, [options?.queryKey, requestData]);
return useQuery<SuccessResponse<K8sJobsListResponse> | ErrorResponse, Error>({ return useQuery<SuccessResponse<K8sJobsListResponse> | ErrorResponse, Error>({
queryFn: ({ signal }) => getK8sJobsList(requestData, signal, headers), queryFn: ({ signal }) =>
getK8sJobsList(requestData, signal, headers, dotMetricsEnabled),
...options, ...options,

View File

@ -15,6 +15,7 @@ type UseGetK8sNamespacesList = (
Error Error
>, >,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled?: boolean,
) => UseQueryResult< ) => UseQueryResult<
SuccessResponse<K8sNamespacesListResponse> | ErrorResponse, SuccessResponse<K8sNamespacesListResponse> | ErrorResponse,
Error Error
@ -24,6 +25,7 @@ export const useGetK8sNamespacesList: UseGetK8sNamespacesList = (
requestData, requestData,
options, options,
headers, headers,
dotMetricsEnabled,
) => { ) => {
const queryKey = useMemo(() => { const queryKey = useMemo(() => {
if (options?.queryKey && Array.isArray(options.queryKey)) { if (options?.queryKey && Array.isArray(options.queryKey)) {
@ -41,7 +43,8 @@ export const useGetK8sNamespacesList: UseGetK8sNamespacesList = (
SuccessResponse<K8sNamespacesListResponse> | ErrorResponse, SuccessResponse<K8sNamespacesListResponse> | ErrorResponse,
Error Error
>({ >({
queryFn: ({ signal }) => getK8sNamespacesList(requestData, signal, headers), queryFn: ({ signal }) =>
getK8sNamespacesList(requestData, signal, headers, dotMetricsEnabled),
...options, ...options,
queryKey, queryKey,
}); });

View File

@ -15,6 +15,7 @@ type UseGetK8sNodesList = (
Error Error
>, >,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled?: boolean,
) => UseQueryResult< ) => UseQueryResult<
SuccessResponse<K8sNodesListResponse> | ErrorResponse, SuccessResponse<K8sNodesListResponse> | ErrorResponse,
Error Error
@ -24,6 +25,7 @@ export const useGetK8sNodesList: UseGetK8sNodesList = (
requestData, requestData,
options, options,
headers, headers,
dotMetricsEnabled,
) => { ) => {
const queryKey = useMemo(() => { const queryKey = useMemo(() => {
if (options?.queryKey && Array.isArray(options.queryKey)) { if (options?.queryKey && Array.isArray(options.queryKey)) {
@ -38,7 +40,8 @@ export const useGetK8sNodesList: UseGetK8sNodesList = (
}, [options?.queryKey, requestData]); }, [options?.queryKey, requestData]);
return useQuery<SuccessResponse<K8sNodesListResponse> | ErrorResponse, Error>({ return useQuery<SuccessResponse<K8sNodesListResponse> | ErrorResponse, Error>({
queryFn: ({ signal }) => getK8sNodesList(requestData, signal, headers), queryFn: ({ signal }) =>
getK8sNodesList(requestData, signal, headers, dotMetricsEnabled),
...options, ...options,
queryKey, queryKey,
}); });

View File

@ -15,6 +15,7 @@ type UseGetK8sPodsList = (
Error Error
>, >,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled?: boolean,
) => UseQueryResult< ) => UseQueryResult<
SuccessResponse<K8sPodsListResponse> | ErrorResponse, SuccessResponse<K8sPodsListResponse> | ErrorResponse,
Error Error
@ -24,6 +25,7 @@ export const useGetK8sPodsList: UseGetK8sPodsList = (
requestData, requestData,
options, options,
headers, headers,
dotMetricsEnabled,
) => { ) => {
const queryKey = useMemo(() => { const queryKey = useMemo(() => {
if (options?.queryKey && Array.isArray(options.queryKey)) { if (options?.queryKey && Array.isArray(options.queryKey)) {
@ -38,7 +40,8 @@ export const useGetK8sPodsList: UseGetK8sPodsList = (
}, [options?.queryKey, requestData]); }, [options?.queryKey, requestData]);
return useQuery<SuccessResponse<K8sPodsListResponse> | ErrorResponse, Error>({ return useQuery<SuccessResponse<K8sPodsListResponse> | ErrorResponse, Error>({
queryFn: ({ signal }) => getK8sPodsList(requestData, signal, headers), queryFn: ({ signal }) =>
getK8sPodsList(requestData, signal, headers, dotMetricsEnabled),
...options, ...options,
queryKey, queryKey,
}); });

View File

@ -17,6 +17,7 @@ type UseGetK8sStatefulSetsList = (
>, >,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled?: boolean,
) => UseQueryResult< ) => UseQueryResult<
SuccessResponse<K8sStatefulSetsListResponse> | ErrorResponse, SuccessResponse<K8sStatefulSetsListResponse> | ErrorResponse,
Error Error
@ -28,6 +29,7 @@ export const useGetK8sStatefulSetsList: UseGetK8sStatefulSetsList = (
options, options,
headers, headers,
dotMetricsEnabled,
) => { ) => {
const queryKey = useMemo(() => { const queryKey = useMemo(() => {
if (options?.queryKey && Array.isArray(options.queryKey)) { if (options?.queryKey && Array.isArray(options.queryKey)) {
@ -45,7 +47,8 @@ export const useGetK8sStatefulSetsList: UseGetK8sStatefulSetsList = (
SuccessResponse<K8sStatefulSetsListResponse> | ErrorResponse, SuccessResponse<K8sStatefulSetsListResponse> | ErrorResponse,
Error Error
>({ >({
queryFn: ({ signal }) => getK8sStatefulSetsList(requestData, signal, headers), queryFn: ({ signal }) =>
getK8sStatefulSetsList(requestData, signal, headers, dotMetricsEnabled),
...options, ...options,

View File

@ -15,6 +15,7 @@ type UseGetK8sVolumesList = (
Error Error
>, >,
headers?: Record<string, string>, headers?: Record<string, string>,
dotMetricsEnabled?: boolean,
) => UseQueryResult< ) => UseQueryResult<
SuccessResponse<K8sVolumesListResponse> | ErrorResponse, SuccessResponse<K8sVolumesListResponse> | ErrorResponse,
Error Error
@ -24,6 +25,7 @@ export const useGetK8sVolumesList: UseGetK8sVolumesList = (
requestData, requestData,
options, options,
headers, headers,
dotMetricsEnabled,
) => { ) => {
const queryKey = useMemo(() => { const queryKey = useMemo(() => {
if (options?.queryKey && Array.isArray(options.queryKey)) { if (options?.queryKey && Array.isArray(options.queryKey)) {
@ -41,7 +43,8 @@ export const useGetK8sVolumesList: UseGetK8sVolumesList = (
SuccessResponse<K8sVolumesListResponse> | ErrorResponse, SuccessResponse<K8sVolumesListResponse> | ErrorResponse,
Error Error
>({ >({
queryFn: ({ signal }) => getK8sVolumesList(requestData, signal, headers), queryFn: ({ signal }) =>
getK8sVolumesList(requestData, signal, headers, dotMetricsEnabled),
...options, ...options,
queryKey, queryKey,
}); });

View File

@ -27,6 +27,7 @@ export type WhereClauseConfig = {
export const useAutoComplete = ( export const useAutoComplete = (
query: IBuilderQuery, query: IBuilderQuery,
dotMetricsEnabled: boolean,
whereClauseConfig?: WhereClauseConfig, whereClauseConfig?: WhereClauseConfig,
shouldUseSuggestions?: boolean, shouldUseSuggestions?: boolean,
isInfraMonitoring?: boolean, isInfraMonitoring?: boolean,
@ -39,6 +40,7 @@ export const useAutoComplete = (
const { keys, results, isFetching, exampleQueries } = useFetchKeysAndValues( const { keys, results, isFetching, exampleQueries } = useFetchKeysAndValues(
searchValue, searchValue,
query, query,
dotMetricsEnabled,
searchKey, searchKey,
shouldUseSuggestions, shouldUseSuggestions,
isInfraMonitoring, isInfraMonitoring,

View File

@ -4,8 +4,8 @@ import { getAttributesValues } from 'api/queryBuilder/getAttributesValues';
import { DATA_TYPE_VS_ATTRIBUTE_VALUES_KEY } from 'constants/queryBuilder'; import { DATA_TYPE_VS_ATTRIBUTE_VALUES_KEY } from 'constants/queryBuilder';
import { DEBOUNCE_DELAY } from 'constants/queryBuilderFilterConfig'; import { DEBOUNCE_DELAY } from 'constants/queryBuilderFilterConfig';
import { import {
GetK8sEntityToAggregateAttribute,
K8sCategory, K8sCategory,
K8sEntityToAggregateAttributeMapping,
} from 'container/InfraMonitoringK8s/constants'; } from 'container/InfraMonitoringK8s/constants';
import { import {
getRemovePrefixFromKey, getRemovePrefixFromKey,
@ -50,6 +50,7 @@ type IuseFetchKeysAndValues = {
export const useFetchKeysAndValues = ( export const useFetchKeysAndValues = (
searchValue: string, searchValue: string,
query: IBuilderQuery, query: IBuilderQuery,
dotMetricsEnabled: boolean,
searchKey: string, searchKey: string,
shouldUseSuggestions?: boolean, shouldUseSuggestions?: boolean,
isInfraMonitoring?: boolean, isInfraMonitoring?: boolean,
@ -123,7 +124,7 @@ export const useFetchKeysAndValues = (
aggregateOperator: query.aggregateOperator, aggregateOperator: query.aggregateOperator,
aggregateAttribute: aggregateAttribute:
isInfraMonitoring && entity isInfraMonitoring && entity
? K8sEntityToAggregateAttributeMapping[entity] ? GetK8sEntityToAggregateAttribute(entity, dotMetricsEnabled)
: query.aggregateAttribute.key, : query.aggregateAttribute.key,
tagType: query.aggregateAttribute.type ?? null, tagType: query.aggregateAttribute.type ?? null,
}, },
@ -219,7 +220,7 @@ export const useFetchKeysAndValues = (
aggregateOperator: 'noop', aggregateOperator: 'noop',
dataSource: query.dataSource, dataSource: query.dataSource,
aggregateAttribute: aggregateAttribute:
K8sEntityToAggregateAttributeMapping[entity] || GetK8sEntityToAggregateAttribute(entity, dotMetricsEnabled) ||
query.aggregateAttribute.key, query.aggregateAttribute.key,
attributeKey: filterAttributeKey?.key ?? tagKey, attributeKey: filterAttributeKey?.key ?? tagKey,
filterAttributeKeyDataType: filterAttributeKeyDataType:

View File

@ -7,6 +7,8 @@ import { encode } from 'js-base64';
import { ReactNode, useCallback, useEffect, useMemo, useState } from 'react'; import { ReactNode, useCallback, useEffect, useMemo, useState } from 'react';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom';
import { FeatureKeys } from '../../constants/features';
import { useAppContext } from '../../providers/App/App';
import { whilelistedKeys } from './config'; import { whilelistedKeys } from './config';
import { ResourceContext } from './context'; import { ResourceContext } from './context';
import { ResourceAttributesFilterMachine } from './machine'; import { ResourceAttributesFilterMachine } from './machine';
@ -18,6 +20,7 @@ import {
import { import {
createQuery, createQuery,
getResourceAttributeQueriesFromURL, getResourceAttributeQueriesFromURL,
getResourceDeploymentKeys,
GetTagKeys, GetTagKeys,
GetTagValues, GetTagValues,
mappingWithRoutesAndKeys, mappingWithRoutesAndKeys,
@ -53,6 +56,11 @@ function ResourceProvider({ children }: Props): JSX.Element {
} }
}; };
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const dispatchQueries = useCallback( const dispatchQueries = useCallback(
(queries: IResourceAttribute[]): void => { (queries: IResourceAttribute[]): void => {
urlQuery.set( urlQuery.set(
@ -70,7 +78,7 @@ function ResourceProvider({ children }: Props): JSX.Element {
actions: { actions: {
onSelectTagKey: () => { onSelectTagKey: () => {
handleLoading(true); handleLoading(true);
GetTagKeys() GetTagKeys(dotMetricsEnabled)
.then((tagKeys) => { .then((tagKeys) => {
const options = mappingWithRoutesAndKeys(pathname, tagKeys); const options = mappingWithRoutesAndKeys(pathname, tagKeys);
@ -141,10 +149,10 @@ function ResourceProvider({ children }: Props): JSX.Element {
const handleEnvironmentChange = useCallback( const handleEnvironmentChange = useCallback(
(environments: string[]): void => { (environments: string[]): void => {
const staging = ['resource_deployment_environment', 'IN']; const staging = [getResourceDeploymentKeys(dotMetricsEnabled), 'IN'];
const queriesCopy = queries.filter( const queriesCopy = queries.filter(
(query) => query.tagKey !== 'resource_deployment_environment', (query) => query.tagKey !== getResourceDeploymentKeys(dotMetricsEnabled),
); );
if (environments && Array.isArray(environments) && environments.length > 0) { if (environments && Array.isArray(environments) && environments.length > 0) {
@ -159,7 +167,7 @@ function ResourceProvider({ children }: Props): JSX.Element {
send('RESET'); send('RESET');
}, },
[dispatchQueries, queries, send], [dispatchQueries, dotMetricsEnabled, queries, send],
); );
const handleClose = useCallback( const handleClose = useCallback(

View File

@ -1,10 +1,14 @@
import { act, renderHook, waitFor } from '@testing-library/react'; import { act, renderHook, waitFor } from '@testing-library/react';
import { createMemoryHistory } from 'history'; import { createMemoryHistory } from 'history';
import { AppProvider } from 'providers/App/App';
import { QueryClient, QueryClientProvider } from 'react-query';
import { Router } from 'react-router-dom'; import { Router } from 'react-router-dom';
import ResourceProvider from '../ResourceProvider'; import ResourceProvider from '../ResourceProvider';
import useResourceAttribute from '../useResourceAttribute'; import useResourceAttribute from '../useResourceAttribute';
const queryClient = new QueryClient();
jest.mock('hooks/useSafeNavigate', () => ({ jest.mock('hooks/useSafeNavigate', () => ({
useSafeNavigate: (): any => ({ useSafeNavigate: (): any => ({
safeNavigate: jest.fn(), safeNavigate: jest.fn(),
@ -17,9 +21,13 @@ describe('useResourceAttribute component hook', () => {
initialEntries: ['/inital-url?tab=overview'], initialEntries: ['/inital-url?tab=overview'],
}); });
const wrapper = ({ children }: { children: any }): JSX.Element => ( const wrapper = ({ children }: { children: any }): JSX.Element => (
<QueryClientProvider client={queryClient}>
<AppProvider>
<Router history={history}> <Router history={history}>
<ResourceProvider>{children}</ResourceProvider> <ResourceProvider>{children}</ResourceProvider>
</Router> </Router>
</AppProvider>
</QueryClientProvider>
); );
const { result } = renderHook(() => useResourceAttribute(), { wrapper }); const { result } = renderHook(() => useResourceAttribute(), { wrapper });

View File

@ -146,7 +146,17 @@ export const OperatorSchema: IOption[] = OperatorConversions.map(
}), }),
); );
export const GetTagKeys = async (): Promise<IOption[]> => { export const getResourceDeploymentKeys = (
dotMetricsEnabled: boolean,
): string => {
if (dotMetricsEnabled) return 'resource_deployment.environment';
return 'resource_deployment_environment';
};
export const GetTagKeys = async (
dotMetricsEnabled: boolean,
): Promise<IOption[]> => {
const resourceDeploymentKey = getResourceDeploymentKeys(dotMetricsEnabled);
const { payload } = await getResourceAttributesTagKeys({ const { payload } = await getResourceAttributesTagKeys({
metricName: 'signoz_calls_total', metricName: 'signoz_calls_total',
match: 'resource_', match: 'resource_',
@ -159,17 +169,19 @@ export const GetTagKeys = async (): Promise<IOption[]> => {
payload.data.attributeKeys?.map((attributeKey) => attributeKey.key) || []; payload.data.attributeKeys?.map((attributeKey) => attributeKey.key) || [];
return keys return keys
.filter((tagKey: string) => tagKey !== 'resource_deployment_environment') .filter((tagKey: string) => tagKey !== resourceDeploymentKey)
.map((tagKey: string) => ({ .map((tagKey: string) => ({
label: convertMetricKeyToTrace(tagKey), label: convertMetricKeyToTrace(tagKey),
value: tagKey, value: tagKey,
})); }));
}; };
export const getEnvironmentTagKeys = async (): Promise<IOption[]> => { export const getEnvironmentTagKeys = async (
dotMetricsEnabled: boolean,
): Promise<IOption[]> => {
const { payload } = await getResourceAttributesTagKeys({ const { payload } = await getResourceAttributesTagKeys({
metricName: 'signoz_calls_total', metricName: 'signoz_calls_total',
match: 'resource_deployment_environment', match: getResourceDeploymentKeys(dotMetricsEnabled),
}); });
if (!payload || !payload?.data) { if (!payload || !payload?.data) {
return []; return [];
@ -182,9 +194,11 @@ export const getEnvironmentTagKeys = async (): Promise<IOption[]> => {
})); }));
}; };
export const getEnvironmentTagValues = async (): Promise<IOption[]> => { export const getEnvironmentTagValues = async (
dotMetricsEnabled: boolean,
): Promise<IOption[]> => {
const { payload } = await getResourceAttributesTagValues({ const { payload } = await getResourceAttributesTagValues({
tagKey: 'resource_deployment_environment', tagKey: getResourceDeploymentKeys(dotMetricsEnabled),
metricName: 'signoz_calls_total', metricName: 'signoz_calls_total',
}); });

View File

@ -4,22 +4,24 @@ import { useIsDarkMode } from 'hooks/useDarkMode';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Widgets } from 'types/api/dashboard/getAll'; import { Widgets } from 'types/api/dashboard/getAll';
import { FeatureKeys } from '../../../../constants/features';
import { useAppContext } from '../../../../providers/App/App';
import MetricPageGridGraph from './MetricPageGraph'; import MetricPageGridGraph from './MetricPageGraph';
import { import {
averageRequestLatencyWidgetData, getAverageRequestLatencyWidgetData,
brokerCountWidgetData, getBrokerCountWidgetData,
brokerNetworkThroughputWidgetData, getBrokerNetworkThroughputWidgetData,
bytesConsumedWidgetData, getBytesConsumedWidgetData,
consumerFetchRateWidgetData, getConsumerFetchRateWidgetData,
consumerGroupMemberWidgetData, getConsumerGroupMemberWidgetData,
consumerLagByGroupWidgetData, getConsumerLagByGroupWidgetData,
consumerOffsetWidgetData, getConsumerOffsetWidgetData,
ioWaitTimeWidgetData, getIoWaitTimeWidgetData,
kafkaProducerByteRateWidgetData, getKafkaProducerByteRateWidgetData,
messagesConsumedWidgetData, getMessagesConsumedWidgetData,
producerFetchRequestPurgatoryWidgetData, getProducerFetchRequestPurgatoryWidgetData,
requestResponseWidgetData, getRequestResponseWidgetData,
requestTimesWidgetData, getRequestTimesWidgetData,
} from './MetricPageUtil'; } from './MetricPageUtil';
interface MetricSectionProps { interface MetricSectionProps {
@ -71,15 +73,20 @@ function MetricColumnGraphs({
}): JSX.Element { }): JSX.Element {
const { t } = useTranslation('messagingQueues'); const { t } = useTranslation('messagingQueues');
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const metricsData = [ const metricsData = [
{ {
title: t('metricGraphCategory.brokerMetrics.title'), title: t('metricGraphCategory.brokerMetrics.title'),
description: t('metricGraphCategory.brokerMetrics.description'), description: t('metricGraphCategory.brokerMetrics.description'),
graphCount: [ graphCount: [
brokerCountWidgetData, getBrokerCountWidgetData(dotMetricsEnabled),
requestTimesWidgetData, getRequestTimesWidgetData(dotMetricsEnabled),
producerFetchRequestPurgatoryWidgetData, getProducerFetchRequestPurgatoryWidgetData(dotMetricsEnabled),
brokerNetworkThroughputWidgetData, getBrokerNetworkThroughputWidgetData(dotMetricsEnabled),
], ],
id: 'broker-metrics', id: 'broker-metrics',
}, },
@ -87,11 +94,11 @@ function MetricColumnGraphs({
title: t('metricGraphCategory.producerMetrics.title'), title: t('metricGraphCategory.producerMetrics.title'),
description: t('metricGraphCategory.producerMetrics.description'), description: t('metricGraphCategory.producerMetrics.description'),
graphCount: [ graphCount: [
ioWaitTimeWidgetData, getIoWaitTimeWidgetData(dotMetricsEnabled),
requestResponseWidgetData, getRequestResponseWidgetData(dotMetricsEnabled),
averageRequestLatencyWidgetData, getAverageRequestLatencyWidgetData(dotMetricsEnabled),
kafkaProducerByteRateWidgetData, getKafkaProducerByteRateWidgetData(dotMetricsEnabled),
bytesConsumedWidgetData, getBytesConsumedWidgetData(dotMetricsEnabled),
], ],
id: 'producer-metrics', id: 'producer-metrics',
}, },
@ -99,11 +106,11 @@ function MetricColumnGraphs({
title: t('metricGraphCategory.consumerMetrics.title'), title: t('metricGraphCategory.consumerMetrics.title'),
description: t('metricGraphCategory.consumerMetrics.description'), description: t('metricGraphCategory.consumerMetrics.description'),
graphCount: [ graphCount: [
consumerOffsetWidgetData, getConsumerOffsetWidgetData(dotMetricsEnabled),
consumerGroupMemberWidgetData, getConsumerGroupMemberWidgetData(dotMetricsEnabled),
consumerLagByGroupWidgetData, getConsumerLagByGroupWidgetData(dotMetricsEnabled),
consumerFetchRateWidgetData, getConsumerFetchRateWidgetData(dotMetricsEnabled),
messagesConsumedWidgetData, getMessagesConsumedWidgetData(dotMetricsEnabled),
], ],
id: 'consumer-metrics', id: 'consumer-metrics',
}, },

View File

@ -10,17 +10,19 @@ import { useRef, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Widgets } from 'types/api/dashboard/getAll'; import { Widgets } from 'types/api/dashboard/getAll';
import { FeatureKeys } from '../../../../constants/features';
import { useAppContext } from '../../../../providers/App/App';
import MetricColumnGraphs from './MetricColumnGraphs'; import MetricColumnGraphs from './MetricColumnGraphs';
import MetricPageGridGraph from './MetricPageGraph'; import MetricPageGridGraph from './MetricPageGraph';
import { import {
cpuRecentUtilizationWidgetData, getCpuRecentUtilizationWidgetData,
currentOffsetPartitionWidgetData, getCurrentOffsetPartitionWidgetData,
insyncReplicasWidgetData, getInsyncReplicasWidgetData,
jvmGcCollectionsElapsedWidgetData, getJvmGcCollectionsElapsedWidgetData,
jvmGCCountWidgetData, getJvmGCCountWidgetData,
jvmMemoryHeapWidgetData, getJvmMemoryHeapWidgetData,
oldestOffsetWidgetData, getOldestOffsetWidgetData,
partitionCountPerTopicWidgetData, getPartitionCountPerTopicWidgetData,
} from './MetricPageUtil'; } from './MetricPageUtil';
interface CollapsibleMetricSectionProps { interface CollapsibleMetricSectionProps {
@ -95,6 +97,11 @@ function MetricPage(): JSX.Element {
})); }));
}; };
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const { t } = useTranslation('messagingQueues'); const { t } = useTranslation('messagingQueues');
const metricSections = [ const metricSections = [
@ -103,10 +110,10 @@ function MetricPage(): JSX.Element {
title: t('metricGraphCategory.brokerJVMMetrics.title'), title: t('metricGraphCategory.brokerJVMMetrics.title'),
description: t('metricGraphCategory.brokerJVMMetrics.description'), description: t('metricGraphCategory.brokerJVMMetrics.description'),
graphCount: [ graphCount: [
jvmGCCountWidgetData, getJvmGCCountWidgetData(dotMetricsEnabled),
jvmGcCollectionsElapsedWidgetData, getJvmGcCollectionsElapsedWidgetData(dotMetricsEnabled),
cpuRecentUtilizationWidgetData, getCpuRecentUtilizationWidgetData(dotMetricsEnabled),
jvmMemoryHeapWidgetData, getJvmMemoryHeapWidgetData(dotMetricsEnabled),
], ],
}, },
{ {
@ -114,10 +121,10 @@ function MetricPage(): JSX.Element {
title: t('metricGraphCategory.partitionMetrics.title'), title: t('metricGraphCategory.partitionMetrics.title'),
description: t('metricGraphCategory.partitionMetrics.description'), description: t('metricGraphCategory.partitionMetrics.description'),
graphCount: [ graphCount: [
partitionCountPerTopicWidgetData, getPartitionCountPerTopicWidgetData(dotMetricsEnabled),
currentOffsetPartitionWidgetData, getCurrentOffsetPartitionWidgetData(dotMetricsEnabled),
oldestOffsetWidgetData, getOldestOffsetWidgetData(dotMetricsEnabled),
insyncReplicasWidgetData, getInsyncReplicasWidgetData(dotMetricsEnabled),
], ],
}, },
]; ];

View File

@ -79,16 +79,23 @@ export function getWidgetQuery(
}; };
} }
export const requestTimesWidgetData = getWidgetQueryBuilder( export const getRequestTimesWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
// choose key based on flag
key: dotMetricsEnabled
? 'kafka.request.time.avg'
: 'kafka_request_time_avg',
// mirror into the id as well
id: 'kafka_request_time_avg--float64--Gauge--true', id: 'kafka_request_time_avg--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_request_time_avg',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
@ -118,26 +125,24 @@ export const requestTimesWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const brokerCountWidgetData = getWidgetQueryBuilder( export const getBrokerCountWidgetData = (dotMetricsEnabled: boolean): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
key: dotMetricsEnabled ? 'kafka.brokers' : 'kafka_brokers',
id: 'kafka_brokers--float64--Gauge--true', id: 'kafka_brokers--float64--Gauge--true',
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_brokers',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'sum', aggregateOperator: 'sum',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -152,30 +157,33 @@ export const brokerCountWidgetData = getWidgetQueryBuilder(
}, },
], ],
title: 'Broker Count', title: 'Broker Count',
description: 'Total number of active brokers in the Kafka cluster.\n', description: 'Total number of active brokers in the Kafka cluster.',
}), }),
); );
export const producerFetchRequestPurgatoryWidgetData = getWidgetQueryBuilder( export const getProducerFetchRequestPurgatoryWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_purgatory_size--float64--Gauge--true', // inline ternary based on dotMetricsEnabled
key: dotMetricsEnabled ? 'kafka.purgatory.size' : 'kafka_purgatory_size',
id: `${
dotMetricsEnabled ? 'kafka.purgatory.size' : 'kafka_purgatory_size'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_purgatory_size',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -195,27 +203,33 @@ export const producerFetchRequestPurgatoryWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const brokerNetworkThroughputWidgetData = getWidgetQueryBuilder( export const getBrokerNetworkThroughputWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: // inline ternary based on dotMetricsEnabled
'kafka_server_brokertopicmetrics_bytesoutpersec_oneminuterate--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka_server_brokertopicmetrics_total_replicationbytesinpersec_oneminuterate'
: 'kafka_server_brokertopicmetrics_bytesoutpersec_oneminuterate',
id: `${
dotMetricsEnabled
? 'kafka_server_brokertopicmetrics_total_replicationbytesinpersec_oneminuterate'
: 'kafka_server_brokertopicmetrics_bytesoutpersec_oneminuterate'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_server_brokertopicmetrics_bytesoutpersec_oneminuterate',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -235,26 +249,31 @@ export const brokerNetworkThroughputWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const ioWaitTimeWidgetData = getWidgetQueryBuilder( export const getIoWaitTimeWidgetData = (dotMetricsEnabled: boolean): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_producer_io_waittime_total--float64--Sum--true', // inline ternary based on dotMetricsEnabled
key: dotMetricsEnabled
? 'kafka.producer.io_waittime_total'
: 'kafka_producer_io_waittime_total',
id: `${
dotMetricsEnabled
? 'kafka.producer.io_waittime_total'
: 'kafka_producer_io_waittime_total'
}--float64--Sum--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_producer_io_waittime_total',
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'rate', aggregateOperator: 'rate',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -274,26 +293,32 @@ export const ioWaitTimeWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const requestResponseWidgetData = getWidgetQueryBuilder( export const getRequestResponseWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_producer_request_rate--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.producer.request_rate'
: 'kafka_producer_request_rate',
id: `${
dotMetricsEnabled
? 'kafka.producer.request_rate'
: 'kafka_producer_request_rate'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_producer_request_rate',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -309,20 +334,23 @@ export const requestResponseWidgetData = getWidgetQueryBuilder(
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_producer_response_rate--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.producer.response_rate'
: 'kafka_producer_response_rate',
id: `${
dotMetricsEnabled
? 'kafka.producer.response_rate'
: 'kafka_producer_response_rate'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_producer_response_rate',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'B', expression: 'B',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -342,26 +370,32 @@ export const requestResponseWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const averageRequestLatencyWidgetData = getWidgetQueryBuilder( export const getAverageRequestLatencyWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_producer_request_latency_avg--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.producer.request_latency_avg'
: 'kafka_producer_request_latency_avg',
id: `${
dotMetricsEnabled
? 'kafka.producer.request_latency_avg'
: 'kafka_producer_request_latency_avg'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_producer_request_latency_avg',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -381,26 +415,32 @@ export const averageRequestLatencyWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const kafkaProducerByteRateWidgetData = getWidgetQueryBuilder( export const getKafkaProducerByteRateWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_producer_byte_rate--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.producer.byte_rate'
: 'kafka_producer_byte_rate',
id: `${
dotMetricsEnabled
? 'kafka.producer.byte_rate'
: 'kafka_producer_byte_rate'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_producer_byte_rate',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [ groupBy: [
{ {
@ -423,32 +463,40 @@ export const kafkaProducerByteRateWidgetData = getWidgetQueryBuilder(
timeAggregation: 'avg', timeAggregation: 'avg',
}, },
], ],
title: 'kafka_producer_byte_rate', title: dotMetricsEnabled
? 'kafka.producer.byte_rate'
: 'kafka_producer_byte_rate',
description: description:
'Helps measure the data output rate from the producer, indicating the load a producer is placing on Kafka brokers.', 'Helps measure the data output rate from the producer, indicating the load a producer is placing on Kafka brokers.',
}), }),
); );
export const bytesConsumedWidgetData = getWidgetQueryBuilder( export const getBytesConsumedWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_consumer_bytes_consumed_rate--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.consumer.bytes_consumed_rate'
: 'kafka_consumer_bytes_consumed_rate',
id: `${
dotMetricsEnabled
? 'kafka.consumer.bytes_consumed_rate'
: 'kafka_consumer_bytes_consumed_rate'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_consumer_bytes_consumed_rate',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -462,32 +510,39 @@ export const bytesConsumedWidgetData = getWidgetQueryBuilder(
timeAggregation: 'avg', timeAggregation: 'avg',
}, },
], ],
// Use kebab-case title as requested
title: 'Bytes Consumed', title: 'Bytes Consumed',
description: description:
'Helps Kafka administrators monitor the data consumption rate of a consumer group, showing how much data (in bytes) is being read from the Kafka cluster over time.', 'Helps Kafka administrators monitor the data consumption rate of a consumer group, showing how much data (in bytes) is being read from the Kafka cluster over time.',
}), }),
); );
export const consumerOffsetWidgetData = getWidgetQueryBuilder( export const getConsumerOffsetWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_consumer_group_offset--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.consumer_group.offset'
: 'kafka_consumer_group_offset',
id: `${
dotMetricsEnabled
? 'kafka.consumer_group.offset'
: 'kafka_consumer_group_offset'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_consumer_group_offset',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [ groupBy: [
{ {
@ -527,30 +582,37 @@ export const consumerOffsetWidgetData = getWidgetQueryBuilder(
}, },
], ],
title: 'Consumer Offset', title: 'Consumer Offset',
description: 'Current offset of each consumer group for each topic partition', description:
'Current offset of each consumer group for each topic partition',
}), }),
); );
export const consumerGroupMemberWidgetData = getWidgetQueryBuilder( export const getConsumerGroupMemberWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_consumer_group_members--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.consumer_group.members'
: 'kafka_consumer_group_members',
id: `${
dotMetricsEnabled
? 'kafka.consumer_group.members'
: 'kafka_consumer_group_members'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_consumer_group_members',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'sum', aggregateOperator: 'sum',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [ groupBy: [
{ {
@ -578,26 +640,32 @@ export const consumerGroupMemberWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const consumerLagByGroupWidgetData = getWidgetQueryBuilder( export const getConsumerLagByGroupWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_consumer_group_lag--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.consumer_group.lag'
: 'kafka_consumer_group_lag',
id: `${
dotMetricsEnabled
? 'kafka.consumer_group.lag'
: 'kafka_consumer_group_lag'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_consumer_group_lag',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [ groupBy: [
{ {
@ -642,26 +710,32 @@ export const consumerLagByGroupWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const consumerFetchRateWidgetData = getWidgetQueryBuilder( export const getConsumerFetchRateWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_consumer_fetch_rate--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.consumer.fetch_rate'
: 'kafka_consumer_fetch_rate',
id: `${
dotMetricsEnabled
? 'kafka.consumer.fetch_rate'
: 'kafka_consumer_fetch_rate'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_consumer_fetch_rate',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [ groupBy: [
{ {
@ -669,7 +743,7 @@ export const consumerFetchRateWidgetData = getWidgetQueryBuilder(
id: 'service_name--string--tag--false', id: 'service_name--string--tag--false',
isColumn: false, isColumn: false,
isJSON: false, isJSON: false,
key: 'service_name', key: dotMetricsEnabled ? 'service.name' : 'service_name',
type: 'tag', type: 'tag',
}, },
], ],
@ -690,26 +764,32 @@ export const consumerFetchRateWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const messagesConsumedWidgetData = getWidgetQueryBuilder( export const getMessagesConsumedWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_consumer_records_consumed_rate--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.consumer.records_consumed_rate'
: 'kafka_consumer_records_consumed_rate',
id: `${
dotMetricsEnabled
? 'kafka.consumer.records_consumed_rate'
: 'kafka_consumer_records_consumed_rate'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_consumer_records_consumed_rate',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -729,26 +809,30 @@ export const messagesConsumedWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const jvmGCCountWidgetData = getWidgetQueryBuilder( export const getJvmGCCountWidgetData = (dotMetricsEnabled: boolean): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'jvm_gc_collections_count--float64--Sum--true', key: dotMetricsEnabled
? 'jvm.gc.collections.count'
: 'jvm_gc_collections_count',
id: `${
dotMetricsEnabled
? 'jvm.gc.collections.count'
: 'jvm_gc_collections_count'
}--float64--Sum--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'jvm_gc_collections_count',
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'rate', aggregateOperator: 'rate',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -768,26 +852,32 @@ export const jvmGCCountWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const jvmGcCollectionsElapsedWidgetData = getWidgetQueryBuilder( export const getJvmGcCollectionsElapsedWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'jvm_gc_collections_elapsed--float64--Sum--true', key: dotMetricsEnabled
? 'jvm.gc.collections.elapsed'
: 'jvm_gc_collections_elapsed',
id: `${
dotMetricsEnabled
? 'jvm.gc.collections.elapsed'
: 'jvm_gc_collections_elapsed'
}--float64--Sum--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'jvm_gc_collections_elapsed',
type: 'Sum', type: 'Sum',
}, },
aggregateOperator: 'rate', aggregateOperator: 'rate',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -801,32 +891,40 @@ export const jvmGcCollectionsElapsedWidgetData = getWidgetQueryBuilder(
timeAggregation: 'rate', timeAggregation: 'rate',
}, },
], ],
title: 'jvm_gc_collections_elapsed', title: dotMetricsEnabled
? 'jvm.gc.collections.elapsed'
: 'jvm_gc_collections_elapsed',
description: description:
'Measures the total time (usually in milliseconds) spent on garbage collection (GC) events in the Java Virtual Machine (JVM).', 'Measures the total time (usually in milliseconds) spent on garbage collection (GC) events in the Java Virtual Machine (JVM).',
}), }),
); );
export const cpuRecentUtilizationWidgetData = getWidgetQueryBuilder( export const getCpuRecentUtilizationWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'jvm_cpu_recent_utilization--float64--Gauge--true', key: dotMetricsEnabled
? 'jvm.cpu.recent_utilization'
: 'jvm_cpu_recent_utilization',
id: `${
dotMetricsEnabled
? 'jvm.cpu.recent_utilization'
: 'jvm_cpu_recent_utilization'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'jvm_cpu_recent_utilization',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -846,26 +944,28 @@ export const cpuRecentUtilizationWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const jvmMemoryHeapWidgetData = getWidgetQueryBuilder( export const getJvmMemoryHeapWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'jvm_memory_heap_max--float64--Gauge--true', key: dotMetricsEnabled ? 'jvm.memory.heap.max' : 'jvm_memory_heap_max',
id: `${
dotMetricsEnabled ? 'jvm.memory.heap.max' : 'jvm_memory_heap_max'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'jvm_memory_heap_max',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [], groupBy: [],
having: [], having: [],
@ -885,26 +985,30 @@ export const jvmMemoryHeapWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const partitionCountPerTopicWidgetData = getWidgetQueryBuilder( export const getPartitionCountPerTopicWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_topic_partitions--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.topic.partitions'
: 'kafka_topic_partitions',
id: `${
dotMetricsEnabled ? 'kafka.topic.partitions' : 'kafka_topic_partitions'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_topic_partitions',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'sum', aggregateOperator: 'sum',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [ groupBy: [
{ {
@ -932,26 +1036,32 @@ export const partitionCountPerTopicWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const currentOffsetPartitionWidgetData = getWidgetQueryBuilder( export const getCurrentOffsetPartitionWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_partition_current_offset--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.partition.current_offset'
: 'kafka_partition_current_offset',
id: `${
dotMetricsEnabled
? 'kafka.partition.current_offset'
: 'kafka_partition_current_offset'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_partition_current_offset',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [ groupBy: [
{ {
@ -988,26 +1098,32 @@ export const currentOffsetPartitionWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const oldestOffsetWidgetData = getWidgetQueryBuilder( export const getOldestOffsetWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_partition_oldest_offset--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.partition.oldest_offset'
: 'kafka_partition_oldest_offset',
id: `${
dotMetricsEnabled
? 'kafka.partition.oldest_offset'
: 'kafka_partition_oldest_offset'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_partition_oldest_offset',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [ groupBy: [
{ {
@ -1044,26 +1160,32 @@ export const oldestOffsetWidgetData = getWidgetQueryBuilder(
}), }),
); );
export const insyncReplicasWidgetData = getWidgetQueryBuilder( export const getInsyncReplicasWidgetData = (
dotMetricsEnabled: boolean,
): Widgets =>
getWidgetQueryBuilder(
getWidgetQuery({ getWidgetQuery({
queryData: [ queryData: [
{ {
aggregateAttribute: { aggregateAttribute: {
dataType: DataTypes.Float64, dataType: DataTypes.Float64,
id: 'kafka_partition_replicas_in_sync--float64--Gauge--true', key: dotMetricsEnabled
? 'kafka.partition.replicas_in_sync'
: 'kafka_partition_replicas_in_sync',
id: `${
dotMetricsEnabled
? 'kafka.partition.replicas_in_sync'
: 'kafka_partition_replicas_in_sync'
}--float64--Gauge--true`,
isColumn: true, isColumn: true,
isJSON: false, isJSON: false,
key: 'kafka_partition_replicas_in_sync',
type: 'Gauge', type: 'Gauge',
}, },
aggregateOperator: 'avg', aggregateOperator: 'avg',
dataSource: DataSource.METRICS, dataSource: DataSource.METRICS,
disabled: false, disabled: false,
expression: 'A', expression: 'A',
filters: { filters: { items: [], op: 'AND' },
items: [],
op: 'AND',
},
functions: [], functions: [],
groupBy: [ groupBy: [
{ {

View File

@ -13,6 +13,8 @@ import { useState } from 'react';
import { useHistory, useLocation } from 'react-router-dom'; import { useHistory, useLocation } from 'react-router-dom';
import { useCopyToClipboard } from 'react-use'; import { useCopyToClipboard } from 'react-use';
import { FeatureKeys } from '../../../constants/features';
import { useAppContext } from '../../../providers/App/App';
import { useGetAllConfigOptions } from './useGetAllConfigOptions'; import { useGetAllConfigOptions } from './useGetAllConfigOptions';
type ConfigOptionType = 'group' | 'topic' | 'partition'; type ConfigOptionType = 'group' | 'topic' | 'partition';
@ -38,11 +40,19 @@ const useConfigOptions = (
isFetching: boolean; isFetching: boolean;
options: DefaultOptionType[]; options: DefaultOptionType[];
} => { } => {
const { featureFlags } = useAppContext();
const dotMetricsEnabled =
featureFlags?.find((flag) => flag.name === FeatureKeys.DOT_METRICS_ENABLED)
?.active || false;
const [searchText, setSearchText] = useState<string>(''); const [searchText, setSearchText] = useState<string>('');
const { isFetching, options } = useGetAllConfigOptions({ const { isFetching, options } = useGetAllConfigOptions(
{
attributeKey: type, attributeKey: type,
searchText, searchText,
}); },
dotMetricsEnabled,
);
const handleDebouncedSearch = useDebouncedFn((searchText): void => { const handleDebouncedSearch = useDebouncedFn((searchText): void => {
setSearchText(searchText as string); setSearchText(searchText as string);
}, 500); }, 500);

Some files were not shown because too many files have changed in this diff Show More