|
21 | 21 | from packaging import version as package_version |
22 | 22 |
|
23 | 23 | from opentelemetry import trace |
| 24 | +from opentelemetry.instrumentation._labeler import clear_labeler |
24 | 25 | from opentelemetry.instrumentation._semconv import ( |
25 | 26 | HTTP_DURATION_HISTOGRAM_BUCKETS_NEW, |
26 | 27 | OTEL_SEMCONV_STABILITY_OPT_IN, |
|
103 | 104 | "http.server.request.duration": _server_duration_attrs_new, |
104 | 105 | } |
105 | 106 |
|
| 107 | +_custom_attributes = ["custom_attr", "endpoint_type", "feature_flag"] |
| 108 | +_server_duration_attrs_old_with_custom = _server_duration_attrs_old.copy() |
| 109 | +_server_duration_attrs_old_with_custom.append("http.target") |
| 110 | +_server_duration_attrs_old_with_custom.extend(_custom_attributes) |
| 111 | +_server_duration_attrs_new_with_custom = _server_duration_attrs_new.copy() |
| 112 | +_server_duration_attrs_new_with_custom.append("http.route") |
| 113 | +_server_duration_attrs_new_with_custom.extend(_custom_attributes) |
| 114 | + |
| 115 | +_recommended_metrics_attrs_old_with_custom = { |
| 116 | + "http.server.active_requests": _server_active_requests_count_attrs_old, |
| 117 | + "http.server.duration": _server_duration_attrs_old_with_custom, |
| 118 | +} |
| 119 | +_recommended_metrics_attrs_new_with_custom = { |
| 120 | + "http.server.active_requests": _server_active_requests_count_attrs_new, |
| 121 | + "http.server.request.duration": _server_duration_attrs_new_with_custom, |
| 122 | +} |
| 123 | +_recommended_metrics_attrs_both_with_custom = { |
| 124 | + "http.server.active_requests": _server_active_requests_count_attrs_both, |
| 125 | + "http.server.duration": _server_duration_attrs_old_with_custom, |
| 126 | + "http.server.request.duration": _server_duration_attrs_new_with_custom, |
| 127 | +} |
| 128 | + |
106 | 129 | _parsed_falcon_version = package_version.parse(_falcon_version) |
107 | 130 |
|
108 | 131 |
|
109 | 132 | class TestFalconBase(TestBase): |
110 | 133 | def setUp(self): |
111 | 134 | super().setUp() |
| 135 | + clear_labeler() |
112 | 136 |
|
113 | 137 | test_name = "" |
114 | 138 | if hasattr(self, "_testMethodName"): |
@@ -544,6 +568,38 @@ def test_falcon_metrics(self): |
544 | 568 | ) |
545 | 569 | self.assertTrue(number_data_point_seen and histogram_data_point_seen) |
546 | 570 |
|
| 571 | + def test_falcon_metrics_custom_attributes(self): |
| 572 | + self.client().simulate_get("/user_custom_attr/123") |
| 573 | + self.client().simulate_get("/user_custom_attr/123") |
| 574 | + self.client().simulate_get("/user_custom_attr/123") |
| 575 | + metrics_list = self.memory_metrics_reader.get_metrics_data() |
| 576 | + number_data_point_seen = False |
| 577 | + histogram_data_point_seen = False |
| 578 | + |
| 579 | + self.assertTrue(len(metrics_list.resource_metrics) != 0) |
| 580 | + for resource_metric in metrics_list.resource_metrics: |
| 581 | + self.assertTrue(len(resource_metric.scope_metrics) != 0) |
| 582 | + for scope_metric in resource_metric.scope_metrics: |
| 583 | + self.assertTrue(len(scope_metric.metrics) != 0) |
| 584 | + for metric in scope_metric.metrics: |
| 585 | + self.assertIn(metric.name, _expected_metric_names) |
| 586 | + data_points = list(metric.data.data_points) |
| 587 | + self.assertEqual(len(data_points), 1) |
| 588 | + for point in data_points: |
| 589 | + if isinstance(point, HistogramDataPoint): |
| 590 | + self.assertEqual(point.count, 3) |
| 591 | + histogram_data_point_seen = True |
| 592 | + if isinstance(point, NumberDataPoint): |
| 593 | + number_data_point_seen = True |
| 594 | + for attr in point.attributes: |
| 595 | + self.assertIn( |
| 596 | + attr, |
| 597 | + _recommended_metrics_attrs_old_with_custom[ |
| 598 | + metric.name |
| 599 | + ], |
| 600 | + ) |
| 601 | + self.assertTrue(number_data_point_seen and histogram_data_point_seen) |
| 602 | + |
547 | 603 | def test_falcon_metric_values_new_semconv(self): |
548 | 604 | number_data_point_seen = False |
549 | 605 | histogram_data_point_seen = False |
@@ -580,6 +636,43 @@ def test_falcon_metric_values_new_semconv(self): |
580 | 636 |
|
581 | 637 | self.assertTrue(number_data_point_seen and histogram_data_point_seen) |
582 | 638 |
|
| 639 | + def test_falcon_metric_values_new_semconv_custom_attributes(self): |
| 640 | + number_data_point_seen = False |
| 641 | + histogram_data_point_seen = False |
| 642 | + |
| 643 | + start = default_timer() |
| 644 | + self.client().simulate_get("/user_custom_attr/123") |
| 645 | + duration = max(default_timer() - start, 0) |
| 646 | + |
| 647 | + metrics_list = self.memory_metrics_reader.get_metrics_data() |
| 648 | + for resource_metric in metrics_list.resource_metrics: |
| 649 | + for scope_metric in resource_metric.scope_metrics: |
| 650 | + for metric in scope_metric.metrics: |
| 651 | + data_points = list(metric.data.data_points) |
| 652 | + self.assertEqual(len(data_points), 1) |
| 653 | + for point in data_points: |
| 654 | + if isinstance(point, HistogramDataPoint): |
| 655 | + self.assertEqual(point.count, 1) |
| 656 | + histogram_data_point_seen = True |
| 657 | + self.assertAlmostEqual( |
| 658 | + duration, point.sum, delta=10 |
| 659 | + ) |
| 660 | + self.assertEqual( |
| 661 | + point.explicit_bounds, |
| 662 | + HTTP_DURATION_HISTOGRAM_BUCKETS_NEW, |
| 663 | + ) |
| 664 | + if isinstance(point, NumberDataPoint): |
| 665 | + self.assertEqual(point.value, 0) |
| 666 | + number_data_point_seen = True |
| 667 | + for attr in point.attributes: |
| 668 | + self.assertIn( |
| 669 | + attr, |
| 670 | + _recommended_metrics_attrs_new_with_custom[ |
| 671 | + metric.name |
| 672 | + ], |
| 673 | + ) |
| 674 | + self.assertTrue(number_data_point_seen and histogram_data_point_seen) |
| 675 | + |
583 | 676 | def test_falcon_metric_values_both_semconv(self): |
584 | 677 | number_data_point_seen = False |
585 | 678 | histogram_data_point_seen = False |
@@ -635,34 +728,59 @@ def test_falcon_metric_values_both_semconv(self): |
635 | 728 | ) |
636 | 729 | self.assertTrue(number_data_point_seen and histogram_data_point_seen) |
637 | 730 |
|
638 | | - def test_falcon_metric_values(self): |
| 731 | + def test_falcon_metric_values_both_semconv_custom_attributes(self): |
639 | 732 | number_data_point_seen = False |
640 | 733 | histogram_data_point_seen = False |
641 | 734 |
|
642 | 735 | start = default_timer() |
643 | | - self.client().simulate_get("/hello/756") |
644 | | - duration = max(round((default_timer() - start) * 1000), 0) |
| 736 | + self.client().simulate_get("/user_custom_attr/123") |
| 737 | + duration_s = default_timer() - start |
645 | 738 |
|
646 | 739 | metrics_list = self.memory_metrics_reader.get_metrics_data() |
| 740 | + |
| 741 | + # pylint: disable=too-many-nested-blocks |
647 | 742 | for resource_metric in metrics_list.resource_metrics: |
648 | 743 | for scope_metric in resource_metric.scope_metrics: |
649 | 744 | for metric in scope_metric.metrics: |
| 745 | + if metric.unit == "ms": |
| 746 | + self.assertEqual(metric.name, "http.server.duration") |
| 747 | + elif metric.unit == "s": |
| 748 | + self.assertEqual( |
| 749 | + metric.name, "http.server.request.duration" |
| 750 | + ) |
| 751 | + else: |
| 752 | + self.assertEqual( |
| 753 | + metric.name, "http.server.active_requests" |
| 754 | + ) |
650 | 755 | data_points = list(metric.data.data_points) |
651 | 756 | self.assertEqual(len(data_points), 1) |
652 | | - for point in list(metric.data.data_points): |
| 757 | + for point in data_points: |
653 | 758 | if isinstance(point, HistogramDataPoint): |
654 | 759 | self.assertEqual(point.count, 1) |
| 760 | + if metric.unit == "ms": |
| 761 | + self.assertAlmostEqual( |
| 762 | + max(round(duration_s * 1000), 0), |
| 763 | + point.sum, |
| 764 | + delta=10, |
| 765 | + ) |
| 766 | + elif metric.unit == "s": |
| 767 | + self.assertAlmostEqual( |
| 768 | + max(duration_s, 0), point.sum, delta=10 |
| 769 | + ) |
| 770 | + self.assertEqual( |
| 771 | + point.explicit_bounds, |
| 772 | + HTTP_DURATION_HISTOGRAM_BUCKETS_NEW, |
| 773 | + ) |
655 | 774 | histogram_data_point_seen = True |
656 | | - self.assertAlmostEqual( |
657 | | - duration, point.sum, delta=10 |
658 | | - ) |
659 | 775 | if isinstance(point, NumberDataPoint): |
660 | 776 | self.assertEqual(point.value, 0) |
661 | 777 | number_data_point_seen = True |
662 | 778 | for attr in point.attributes: |
663 | 779 | self.assertIn( |
664 | 780 | attr, |
665 | | - _recommended_metrics_attrs_old[metric.name], |
| 781 | + _recommended_metrics_attrs_both_with_custom[ |
| 782 | + metric.name |
| 783 | + ], |
666 | 784 | ) |
667 | 785 |
|
668 | 786 | self.assertTrue(number_data_point_seen and histogram_data_point_seen) |
|
0 commit comments