@@ -407,10 +407,6 @@ public function updateCounter(array $data): void
407
407
);
408
408
}
409
409
410
- /**
411
- * @param array $data
412
- * @return bool|int
413
- */
414
410
private function removeMetricOnLabelDiff (array $ data ): bool
415
411
{
416
412
$ metrics = match ($ data ['type ' ]) {
@@ -426,12 +422,9 @@ private function removeMetricOnLabelDiff(array $data): bool
426
422
continue ;
427
423
}
428
424
429
- $ labelDiff1 = count (array_diff ($ metric ['labelNames ' ], $ data ['labelNames ' ]));
430
- $ labelDiff2 = count (array_diff ($ data ['labelNames ' ], $ metric ['labelNames ' ]));
431
-
432
425
if (
433
- ( $ labelDiff1 == 0 && $ labelDiff2 == 0 ) ||
434
- ( $ labelDiff1 == count ( $ metric [ ' labelNames ' ]) && $ labelDiff2 == count ( $ data [ ' labelNames ' ]) )
426
+ $ this -> isMetricLabelNamesIdentical ( $ data [ ' labelNames ' ], $ metric [ ' labelNames ' ]) &&
427
+ ! $ this -> issetMetricWithSuchLabelValues ( $ data [ ' labelValues ' ], $ metric [ ' samples ' ] ?? [] )
435
428
) {
436
429
return false ;
437
430
}
@@ -442,10 +435,40 @@ private function removeMetricOnLabelDiff(array $data): bool
442
435
return false ;
443
436
}
444
437
438
+ private function isMetricLabelNamesIdentical (array $ labelNames , array $ existingMetricLabelNames ): bool
439
+ {
440
+ $ labelDiff1 = count (array_diff ($ existingMetricLabelNames , $ labelNames ));
441
+ $ labelDiff2 = count (array_diff ($ labelNames , $ existingMetricLabelNames ));
442
+
443
+ if (
444
+ ($ labelDiff1 == 0 && $ labelDiff2 == 0 ) ||
445
+ ($ labelDiff1 == count ($ existingMetricLabelNames ) && $ labelDiff2 == count ($ labelNames ))
446
+ ) {
447
+ return true ;
448
+ }
449
+
450
+ return false ;
451
+ }
452
+
453
+ /**
454
+ * Существует ли метрика с таким же labelValues, но с разными ключами
455
+ */
456
+ private function issetMetricWithSuchLabelValues (array $ labelValues , array $ existingMetricSamples ): bool
457
+ {
458
+ foreach ($ existingMetricSamples as $ sample ) {
459
+ if (
460
+ count (array_diff ($ labelValues , $ sample ['labelValues ' ])) == 0 &&
461
+ count (array_diff ($ sample ['labelValues ' ], $ labelValues )) == 0 &&
462
+ (count (array_diff_key ($ labelValues , $ sample ['labelValues ' ])) > 0 || count (array_diff_key ($ sample ['labelValues ' ], $ labelValues )) > 0 )
463
+ ) {
464
+ return true ;
465
+ }
466
+ }
467
+
468
+ return false ;
469
+ }
470
+
445
471
/**
446
- * @param string $type
447
- * @param array $data
448
- * @return bool|int
449
472
* @throws \RedisException
450
473
*/
451
474
public function removeMetric (string $ type , array $ data ): bool
0 commit comments