@oneuptime/common 10.5.1 → 10.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/Models/DatabaseModels/StatusPageGroup.ts +212 -0
  2. package/Models/DatabaseModels/StatusPageResource.ts +86 -0
  3. package/Models/DatabaseModels/TelemetryException.ts +10 -0
  4. package/Server/API/StatusPageAPI.ts +15 -0
  5. package/Server/API/TelemetryAPI.ts +406 -0
  6. package/Server/Infrastructure/Postgres/SchemaMigrations/1779879993421-MigrationName.ts +68 -0
  7. package/Server/Infrastructure/Postgres/SchemaMigrations/1779882573463-MigrationName.ts +65 -0
  8. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +5 -0
  9. package/Server/Services/ExceptionAggregationService.ts +51 -3
  10. package/Server/Services/LogAggregationService.ts +1 -0
  11. package/Server/Services/MetricAggregationService.ts +227 -0
  12. package/Server/Services/OpenTelemetryIngestService.ts +101 -1
  13. package/Server/Services/StatusPageService.ts +5 -0
  14. package/Server/Services/TraceAggregationService.ts +1 -0
  15. package/Server/Utils/Monitor/MonitorLogUtil.ts +146 -6
  16. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +299 -0
  17. package/Types/Monitor/MonitorStep.ts +85 -0
  18. package/Types/StatusPage/StatusPageGroupViewMode.ts +6 -0
  19. package/UI/Components/Accordion/Accordion.tsx +32 -26
  20. package/UI/Components/LogsViewer/LogsViewer.tsx +10 -0
  21. package/UI/Components/LogsViewer/components/FacetSection.tsx +40 -3
  22. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +23 -0
  23. package/UI/Components/LogsViewer/types.ts +2 -0
  24. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +8 -0
  25. package/UI/Components/TelemetryViewer/components/TelemetryFacetSection.tsx +49 -3
  26. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +16 -0
  27. package/UI/Components/TelemetryViewer/types.ts +12 -0
  28. package/build/dist/Models/DatabaseModels/StatusPageGroup.js +217 -0
  29. package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
  30. package/build/dist/Models/DatabaseModels/StatusPageResource.js +88 -0
  31. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  32. package/build/dist/Models/DatabaseModels/TelemetryException.js +11 -0
  33. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  34. package/build/dist/Server/API/StatusPageAPI.js +15 -0
  35. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  36. package/build/dist/Server/API/TelemetryAPI.js +285 -0
  37. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  38. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779879993421-MigrationName.js +42 -0
  39. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779879993421-MigrationName.js.map +1 -0
  40. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779882573463-MigrationName.js +28 -0
  41. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779882573463-MigrationName.js.map +1 -0
  42. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  43. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  44. package/build/dist/Server/Services/ExceptionAggregationService.js +44 -4
  45. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  46. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  47. package/build/dist/Server/Services/MetricAggregationService.js +159 -0
  48. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -0
  49. package/build/dist/Server/Services/OpenTelemetryIngestService.js +60 -3
  50. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  51. package/build/dist/Server/Services/StatusPageService.js +5 -0
  52. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  53. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  54. package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js +127 -4
  55. package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js.map +1 -1
  56. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +204 -0
  57. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -0
  58. package/build/dist/Types/Monitor/MonitorStep.js +59 -0
  59. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  60. package/build/dist/Types/StatusPage/StatusPageGroupViewMode.js +7 -0
  61. package/build/dist/Types/StatusPage/StatusPageGroupViewMode.js.map +1 -0
  62. package/build/dist/UI/Components/Accordion/Accordion.js +11 -11
  63. package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
  64. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +1 -1
  65. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  66. package/build/dist/UI/Components/LogsViewer/components/FacetSection.js +26 -6
  67. package/build/dist/UI/Components/LogsViewer/components/FacetSection.js.map +1 -1
  68. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +12 -1
  69. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  70. package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
  71. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
  72. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  73. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js +32 -6
  74. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js.map +1 -1
  75. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +6 -1
  76. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  77. package/package.json +1 -1
@@ -25,6 +25,7 @@ import ObjectID from "../../Types/ObjectID";
25
25
  import Permission from "../../Types/Permission";
26
26
  import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
27
27
  import UptimePrecision from "../../Types/StatusPage/UptimePrecision";
28
+ import StatusPageGroupViewMode from "../../Types/StatusPage/StatusPageGroupViewMode";
28
29
 
29
30
  @EnableDocumentation()
30
31
  @TableBillingAccessControl({
@@ -695,4 +696,215 @@ export default class StatusPageGroup extends BaseModel {
695
696
  nullable: true,
696
697
  })
697
698
  public uptimePercentPrecision?: UptimePrecision = undefined;
699
+
700
+ @ColumnAccessControl({
701
+ create: [
702
+ Permission.ProjectOwner,
703
+ Permission.ProjectAdmin,
704
+ Permission.ProjectMember,
705
+ Permission.StatusPageAdmin,
706
+ Permission.StatusPageMember,
707
+ Permission.CreateStatusPageGroup,
708
+ ],
709
+ read: [
710
+ Permission.ProjectOwner,
711
+ Permission.ProjectAdmin,
712
+ Permission.ProjectMember,
713
+ Permission.Viewer,
714
+ Permission.StatusPageAdmin,
715
+ Permission.StatusPageMember,
716
+ Permission.StatusPageViewer,
717
+ Permission.ReadStatusPageGroup,
718
+ ],
719
+ update: [
720
+ Permission.ProjectOwner,
721
+ Permission.ProjectAdmin,
722
+ Permission.ProjectMember,
723
+ Permission.StatusPageAdmin,
724
+ Permission.StatusPageMember,
725
+ Permission.EditStatusPageGroup,
726
+ ],
727
+ })
728
+ @TableColumn({
729
+ type: TableColumnType.ShortText,
730
+ title: "View Mode",
731
+ required: false,
732
+ description:
733
+ "Layout of this group on the status page. 'List' renders resources stacked vertically (default). 'Grid' renders resources as a matrix using row and column axes.",
734
+ defaultValue: StatusPageGroupViewMode.List,
735
+ })
736
+ @Column({
737
+ type: ColumnType.ShortText,
738
+ nullable: true,
739
+ default: StatusPageGroupViewMode.List,
740
+ })
741
+ public viewMode?: StatusPageGroupViewMode = undefined;
742
+
743
+ @ColumnAccessControl({
744
+ create: [
745
+ Permission.ProjectOwner,
746
+ Permission.ProjectAdmin,
747
+ Permission.ProjectMember,
748
+ Permission.StatusPageAdmin,
749
+ Permission.StatusPageMember,
750
+ Permission.CreateStatusPageGroup,
751
+ ],
752
+ read: [
753
+ Permission.ProjectOwner,
754
+ Permission.ProjectAdmin,
755
+ Permission.ProjectMember,
756
+ Permission.Viewer,
757
+ Permission.StatusPageAdmin,
758
+ Permission.StatusPageMember,
759
+ Permission.StatusPageViewer,
760
+ Permission.ReadStatusPageGroup,
761
+ ],
762
+ update: [
763
+ Permission.ProjectOwner,
764
+ Permission.ProjectAdmin,
765
+ Permission.ProjectMember,
766
+ Permission.StatusPageAdmin,
767
+ Permission.StatusPageMember,
768
+ Permission.EditStatusPageGroup,
769
+ ],
770
+ })
771
+ @TableColumn({
772
+ type: TableColumnType.ShortText,
773
+ title: "Row Axis Label",
774
+ required: false,
775
+ description:
776
+ "Label shown above the row axis when the group is rendered as a grid (e.g. 'Service', 'Tenant'). Free-form so you can use any dimension you like.",
777
+ })
778
+ @Column({
779
+ nullable: true,
780
+ type: ColumnType.ShortText,
781
+ length: ColumnLength.ShortText,
782
+ })
783
+ public rowAxisLabel?: string = undefined;
784
+
785
+ @ColumnAccessControl({
786
+ create: [
787
+ Permission.ProjectOwner,
788
+ Permission.ProjectAdmin,
789
+ Permission.ProjectMember,
790
+ Permission.StatusPageAdmin,
791
+ Permission.StatusPageMember,
792
+ Permission.CreateStatusPageGroup,
793
+ ],
794
+ read: [
795
+ Permission.ProjectOwner,
796
+ Permission.ProjectAdmin,
797
+ Permission.ProjectMember,
798
+ Permission.Viewer,
799
+ Permission.StatusPageAdmin,
800
+ Permission.StatusPageMember,
801
+ Permission.StatusPageViewer,
802
+ Permission.ReadStatusPageGroup,
803
+ ],
804
+ update: [
805
+ Permission.ProjectOwner,
806
+ Permission.ProjectAdmin,
807
+ Permission.ProjectMember,
808
+ Permission.StatusPageAdmin,
809
+ Permission.StatusPageMember,
810
+ Permission.EditStatusPageGroup,
811
+ ],
812
+ })
813
+ @TableColumn({
814
+ type: TableColumnType.ShortText,
815
+ title: "Column Axis Label",
816
+ required: false,
817
+ description:
818
+ "Label shown above the column axis when the group is rendered as a grid (e.g. 'Region', 'Environment'). Free-form so you can use any dimension you like.",
819
+ })
820
+ @Column({
821
+ nullable: true,
822
+ type: ColumnType.ShortText,
823
+ length: ColumnLength.ShortText,
824
+ })
825
+ public columnAxisLabel?: string = undefined;
826
+
827
+ @ColumnAccessControl({
828
+ create: [
829
+ Permission.ProjectOwner,
830
+ Permission.ProjectAdmin,
831
+ Permission.ProjectMember,
832
+ Permission.StatusPageAdmin,
833
+ Permission.StatusPageMember,
834
+ Permission.CreateStatusPageGroup,
835
+ ],
836
+ read: [
837
+ Permission.ProjectOwner,
838
+ Permission.ProjectAdmin,
839
+ Permission.ProjectMember,
840
+ Permission.Viewer,
841
+ Permission.StatusPageAdmin,
842
+ Permission.StatusPageMember,
843
+ Permission.StatusPageViewer,
844
+ Permission.ReadStatusPageGroup,
845
+ ],
846
+ update: [
847
+ Permission.ProjectOwner,
848
+ Permission.ProjectAdmin,
849
+ Permission.ProjectMember,
850
+ Permission.StatusPageAdmin,
851
+ Permission.StatusPageMember,
852
+ Permission.EditStatusPageGroup,
853
+ ],
854
+ })
855
+ @TableColumn({
856
+ required: false,
857
+ type: TableColumnType.LongText,
858
+ title: "Row Axis Values",
859
+ description:
860
+ "Comma-separated list of row labels for the grid (e.g. 'Auth, API, Database'). Determines row order in the grid layout.",
861
+ })
862
+ @Column({
863
+ nullable: true,
864
+ type: ColumnType.LongText,
865
+ length: ColumnLength.LongText,
866
+ })
867
+ public rowAxisValues?: string = undefined;
868
+
869
+ @ColumnAccessControl({
870
+ create: [
871
+ Permission.ProjectOwner,
872
+ Permission.ProjectAdmin,
873
+ Permission.ProjectMember,
874
+ Permission.StatusPageAdmin,
875
+ Permission.StatusPageMember,
876
+ Permission.CreateStatusPageGroup,
877
+ ],
878
+ read: [
879
+ Permission.ProjectOwner,
880
+ Permission.ProjectAdmin,
881
+ Permission.ProjectMember,
882
+ Permission.Viewer,
883
+ Permission.StatusPageAdmin,
884
+ Permission.StatusPageMember,
885
+ Permission.StatusPageViewer,
886
+ Permission.ReadStatusPageGroup,
887
+ ],
888
+ update: [
889
+ Permission.ProjectOwner,
890
+ Permission.ProjectAdmin,
891
+ Permission.ProjectMember,
892
+ Permission.StatusPageAdmin,
893
+ Permission.StatusPageMember,
894
+ Permission.EditStatusPageGroup,
895
+ ],
896
+ })
897
+ @TableColumn({
898
+ required: false,
899
+ type: TableColumnType.LongText,
900
+ title: "Column Axis Values",
901
+ description:
902
+ "Comma-separated list of column labels for the grid (e.g. 'US-East, EU-West, Asia'). Determines column order in the grid layout.",
903
+ })
904
+ @Column({
905
+ nullable: true,
906
+ type: ColumnType.LongText,
907
+ length: ColumnLength.LongText,
908
+ })
909
+ public columnAxisValues?: string = undefined;
698
910
  }
@@ -926,6 +926,92 @@ export default class StatusPageResource extends BaseModel {
926
926
  })
927
927
  public order?: number = undefined;
928
928
 
929
+ @ColumnAccessControl({
930
+ create: [
931
+ Permission.ProjectOwner,
932
+ Permission.ProjectAdmin,
933
+ Permission.ProjectMember,
934
+ Permission.StatusPageAdmin,
935
+ Permission.StatusPageMember,
936
+ Permission.CreateStatusPageResource,
937
+ ],
938
+ read: [
939
+ Permission.ProjectOwner,
940
+ Permission.ProjectAdmin,
941
+ Permission.ProjectMember,
942
+ Permission.Viewer,
943
+ Permission.StatusPageAdmin,
944
+ Permission.StatusPageMember,
945
+ Permission.StatusPageViewer,
946
+ Permission.ReadStatusPageResource,
947
+ ],
948
+ update: [
949
+ Permission.ProjectOwner,
950
+ Permission.ProjectAdmin,
951
+ Permission.ProjectMember,
952
+ Permission.StatusPageAdmin,
953
+ Permission.StatusPageMember,
954
+ Permission.EditStatusPageResource,
955
+ ],
956
+ })
957
+ @TableColumn({
958
+ type: TableColumnType.ShortText,
959
+ required: false,
960
+ title: "Row Axis Value",
961
+ description:
962
+ "Row this resource belongs to when its status page group is rendered as a grid. Should match one of the row axis values defined on the group.",
963
+ example: "API",
964
+ })
965
+ @Column({
966
+ nullable: true,
967
+ type: ColumnType.ShortText,
968
+ length: ColumnLength.ShortText,
969
+ })
970
+ public rowAxisValue?: string = undefined;
971
+
972
+ @ColumnAccessControl({
973
+ create: [
974
+ Permission.ProjectOwner,
975
+ Permission.ProjectAdmin,
976
+ Permission.ProjectMember,
977
+ Permission.StatusPageAdmin,
978
+ Permission.StatusPageMember,
979
+ Permission.CreateStatusPageResource,
980
+ ],
981
+ read: [
982
+ Permission.ProjectOwner,
983
+ Permission.ProjectAdmin,
984
+ Permission.ProjectMember,
985
+ Permission.Viewer,
986
+ Permission.StatusPageAdmin,
987
+ Permission.StatusPageMember,
988
+ Permission.StatusPageViewer,
989
+ Permission.ReadStatusPageResource,
990
+ ],
991
+ update: [
992
+ Permission.ProjectOwner,
993
+ Permission.ProjectAdmin,
994
+ Permission.ProjectMember,
995
+ Permission.StatusPageAdmin,
996
+ Permission.StatusPageMember,
997
+ Permission.EditStatusPageResource,
998
+ ],
999
+ })
1000
+ @TableColumn({
1001
+ type: TableColumnType.ShortText,
1002
+ required: false,
1003
+ title: "Column Axis Value",
1004
+ description:
1005
+ "Column this resource belongs to when its status page group is rendered as a grid. Should match one of the column axis values defined on the group.",
1006
+ example: "US-East",
1007
+ })
1008
+ @Column({
1009
+ nullable: true,
1010
+ type: ColumnType.ShortText,
1011
+ length: ColumnLength.ShortText,
1012
+ })
1013
+ public columnAxisValue?: string = undefined;
1014
+
929
1015
  @ColumnAccessControl({
930
1016
  create: [],
931
1017
  read: [],
@@ -65,6 +65,16 @@ import Service from "./Service";
65
65
  name: "TelemetryException",
66
66
  })
67
67
  @Index(["projectId", "isResolved", "isArchived"]) // Exceptions dashboard counts/filters
68
+ /*
69
+ * Composite uniqueness on the dedup key used by the OTel traces ingest
70
+ * batched upsert. The ingest path collapses every exception event in a
71
+ * worker batch into a single INSERT … ON CONFLICT (projectId,
72
+ * serviceId, fingerprint) DO UPDATE statement; this index is what makes
73
+ * that conflict target resolvable and stops two concurrent workers from
74
+ * racing the old findOneBy + update path into duplicate rows or lost
75
+ * occuranceCount increments.
76
+ */
77
+ @Index(["projectId", "serviceId", "fingerprint"], { unique: true })
68
78
  export default class TelemetryException extends DatabaseBaseModel {
69
79
  @ColumnAccessControl({
70
80
  create: [
@@ -3070,11 +3070,16 @@ export default class StatusPageAPI extends BaseAPI<
3070
3070
  statusPageGroupId: true,
3071
3071
  statusPageGroup: {
3072
3072
  name: true,
3073
+ viewMode: true,
3074
+ rowAxisLabel: true,
3075
+ columnAxisLabel: true,
3073
3076
  },
3074
3077
  monitorId: true,
3075
3078
  displayTooltip: true,
3076
3079
  displayDescription: true,
3077
3080
  displayName: true,
3081
+ rowAxisValue: true,
3082
+ columnAxisValue: true,
3078
3083
  monitorGroupId: true,
3079
3084
  monitor: {
3080
3085
  _id: true,
@@ -4837,6 +4842,11 @@ export default class StatusPageAPI extends BaseAPI<
4837
4842
  showCurrentStatus: true,
4838
4843
  showUptimePercent: true,
4839
4844
  uptimePercentPrecision: true,
4845
+ viewMode: true,
4846
+ rowAxisLabel: true,
4847
+ columnAxisLabel: true,
4848
+ rowAxisValues: true,
4849
+ columnAxisValues: true,
4840
4850
  },
4841
4851
  sort: {
4842
4852
  order: SortOrder.Ascending,
@@ -4858,6 +4868,9 @@ export default class StatusPageAPI extends BaseAPI<
4858
4868
  statusPageGroupId: true,
4859
4869
  statusPageGroup: {
4860
4870
  name: true,
4871
+ viewMode: true,
4872
+ rowAxisLabel: true,
4873
+ columnAxisLabel: true,
4861
4874
  },
4862
4875
  monitorId: true,
4863
4876
  displayTooltip: true,
@@ -4873,6 +4886,8 @@ export default class StatusPageAPI extends BaseAPI<
4873
4886
  monitorGroupId: true,
4874
4887
  showUptimePercent: true,
4875
4888
  uptimePercentPrecision: true,
4889
+ rowAxisValue: true,
4890
+ columnAxisValue: true,
4876
4891
  },
4877
4892
  sort: {
4878
4893
  order: SortOrder.Ascending,