fix: Handling non-monotonic sums (#1699)

Resolves HDX-2826
This commit is contained in:
Mike Shi 2026-02-04 13:00:21 -08:00 committed by GitHub
parent 00703bc121
commit b6c34b13d9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 31 additions and 7 deletions

View file

@ -0,0 +1,6 @@
---
"@hyperdx/common-utils": patch
"@hyperdx/app": patch
---
fix: Handling non-monotonic sums

View file

@ -280,7 +280,9 @@ function ExpandableLegendItem({
/>
</svg>
</div>
{isExpanded ? entry.value : truncateMiddle(`${entry.value}`, 35)}
{isExpanded || isSelected
? entry.value
: truncateMiddle(`${entry.value}`, 35)}
</span>
);
}

View file

@ -552,7 +552,10 @@ exports[`renderChartConfig k8s semantic convention migrations should generate SQ
cityHash64(mapConcat(ScopeAttributes, ResourceAttributes, Attributes)) AS AttributesHash,
IF(AggregationTemporality = 1,
SUM(Value) OVER (PARTITION BY AttributesHash ORDER BY AttributesHash, TimeUnix ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
deltaSum(Value) OVER (PARTITION BY AttributesHash ORDER BY AttributesHash, TimeUnix ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
IF(IsMonotonic = 0,
Value,
deltaSum(Value) OVER (PARTITION BY AttributesHash ORDER BY AttributesHash, TimeUnix ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
)
) AS Rate,
IF(AggregationTemporality = 1, Rate, Value) AS Sum
FROM default.otel_metrics_sum
@ -562,7 +565,7 @@ exports[`renderChartConfig k8s semantic convention migrations should generate SQ
AttributesHash,
last_value(Source.Rate) AS \`__hdx_value_high\`,
any(\`__hdx_value_high\`) OVER(PARTITION BY AttributesHash ORDER BY \`__hdx_time_bucket2\` ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS \`__hdx_value_high_prev\`,
\`__hdx_value_high\` - \`__hdx_value_high_prev\` AS Rate,
IF(IsMonotonic = 1, \`__hdx_value_high\` - \`__hdx_value_high_prev\`, \`__hdx_value_high\`) AS Rate,
last_value(Source.Sum) AS Sum,
any(ResourceAttributes) AS ResourceAttributes,
any(ResourceSchemaUrl) AS ResourceSchemaUrl,
@ -725,7 +728,10 @@ exports[`renderChartConfig should generate sql for a single sum metric 1`] = `
cityHash64(mapConcat(ScopeAttributes, ResourceAttributes, Attributes)) AS AttributesHash,
IF(AggregationTemporality = 1,
SUM(Value) OVER (PARTITION BY AttributesHash ORDER BY AttributesHash, TimeUnix ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
deltaSum(Value) OVER (PARTITION BY AttributesHash ORDER BY AttributesHash, TimeUnix ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
IF(IsMonotonic = 0,
Value,
deltaSum(Value) OVER (PARTITION BY AttributesHash ORDER BY AttributesHash, TimeUnix ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
)
) AS Rate,
IF(AggregationTemporality = 1, Rate, Value) AS Sum
FROM default.otel_metrics_sum
@ -735,7 +741,7 @@ exports[`renderChartConfig should generate sql for a single sum metric 1`] = `
AttributesHash,
last_value(Source.Rate) AS \`__hdx_value_high\`,
any(\`__hdx_value_high\`) OVER(PARTITION BY AttributesHash ORDER BY \`__hdx_time_bucket2\` ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS \`__hdx_value_high_prev\`,
\`__hdx_value_high\` - \`__hdx_value_high_prev\` AS Rate,
IF(IsMonotonic = 1, \`__hdx_value_high\` - \`__hdx_value_high_prev\`, \`__hdx_value_high\`) AS Rate,
last_value(Source.Sum) AS Sum,
any(ResourceAttributes) AS ResourceAttributes,
any(ResourceSchemaUrl) AS ResourceSchemaUrl,

View file

@ -1207,6 +1207,13 @@ async function translateMetricChartConfig(
metadata,
);
/**
* See: https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/metrics/v1/metrics.proto
* AGGREGATION_TEMPORALITY_DELTA = 1;
* AGGREGATION_TEMPORALITY_CUMULATIVE = 2;
*
* Note, IsMonotonic = 0, has Cumulative agg temporality
*/
return {
...restChartConfig,
with: [
@ -1218,7 +1225,10 @@ async function translateMetricChartConfig(
cityHash64(mapConcat(ScopeAttributes, ResourceAttributes, Attributes)) AS AttributesHash,
IF(AggregationTemporality = 1,
SUM(Value) OVER (PARTITION BY AttributesHash ORDER BY AttributesHash, TimeUnix ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
deltaSum(Value) OVER (PARTITION BY AttributesHash ORDER BY AttributesHash, TimeUnix ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
IF(IsMonotonic = 0,
Value,
deltaSum(Value) OVER (PARTITION BY AttributesHash ORDER BY AttributesHash, TimeUnix ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
)
) AS Rate,
IF(AggregationTemporality = 1, Rate, Value) AS Sum
FROM ${renderFrom({ from: { ...from, tableName: metricTables[MetricsDataType.Sum] } })}
@ -1232,7 +1242,7 @@ async function translateMetricChartConfig(
AttributesHash,
last_value(Source.Rate) AS ${valueHighCol},
any(${valueHighCol}) OVER(PARTITION BY AttributesHash ORDER BY \`${timeBucketCol}\` ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS ${valueHighPrevCol},
${valueHighCol} - ${valueHighPrevCol} AS Rate,
IF(IsMonotonic = 1, ${valueHighCol} - ${valueHighPrevCol}, ${valueHighCol}) AS Rate,
last_value(Source.Sum) AS Sum,
any(ResourceAttributes) AS ResourceAttributes,
any(ResourceSchemaUrl) AS ResourceSchemaUrl,