From ce284717630a35fb8099e82dc71aff685b1d9ef6 Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto Date: Fri, 30 Sep 2022 12:00:38 +0200 Subject: [PATCH 1/3] Add missing measurements units --- CHANGELOG.md | 1 + dart/lib/src/sentry_measurement.dart | 14 +-- dart/lib/src/sentry_measurement_unit.dart | 99 ++++++++++++++++++ dart/lib/src/sentry_tracer.dart | 3 +- dart/test/sentry_measurement_test.dart | 12 +-- dart/test/sentry_measurement_unit_test.dart | 110 ++++++++++++++++++++ 6 files changed, 225 insertions(+), 14 deletions(-) create mode 100644 dart/test/sentry_measurement_unit_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 62b0a89dba..b1e89917ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Fixes - Tracer does not allow setting measurement if finished ([#1026](https://github.com/getsentry/sentry-dart/pull/1026)) +- Add missing measurements units ### Features diff --git a/dart/lib/src/sentry_measurement.dart b/dart/lib/src/sentry_measurement.dart index d7c568ee29..89452f3ded 100644 --- a/dart/lib/src/sentry_measurement.dart +++ b/dart/lib/src/sentry_measurement.dart @@ -10,43 +10,43 @@ class SentryMeasurement { /// Amount of frames drawn during a transaction SentryMeasurement.totalFrames(this.value) : name = 'frames_total', - unit = SentryMeasurementUnit.none; + unit = SentryMeasurementUnit.none.toStringValue(); /// Amount of slow frames drawn during a transaction. /// A slow frame is any frame longer than 1s / refreshrate. /// So for example any frame slower than 16ms for a refresh rate of 60hz. SentryMeasurement.slowFrames(this.value) : name = 'frames_slow', - unit = SentryMeasurementUnit.none; + unit = SentryMeasurementUnit.none.toStringValue(); /// Amount of frozen frames drawn during a transaction. /// Typically defined as frames slower than 500ms. SentryMeasurement.frozenFrames(this.value) : name = 'frames_frozen', - unit = SentryMeasurementUnit.none; + unit = SentryMeasurementUnit.none.toStringValue(); /// Duration of the Cold App start in milliseconds SentryMeasurement.coldAppStart(Duration duration) : assert(!duration.isNegative), name = 'app_start_cold', value = duration.inMilliseconds, - unit = SentryMeasurementUnit.milliSecond; + unit = SentryMeasurementUnit.milliSecond.toStringValue(); /// Duration of the Warm App start in milliseconds SentryMeasurement.warmAppStart(Duration duration) : assert(!duration.isNegative), name = 'app_start_warm', value = duration.inMilliseconds, - unit = SentryMeasurementUnit.milliSecond; + unit = SentryMeasurementUnit.milliSecond.toStringValue(); final String name; final num value; - final SentryMeasurementUnit? unit; + final String? unit; Map toJson() { return { 'value': value, - if (unit != null) 'unit': unit?.toStringValue(), + if (unit != null) 'unit': unit, }; } } diff --git a/dart/lib/src/sentry_measurement_unit.dart b/dart/lib/src/sentry_measurement_unit.dart index e53432b827..257dd1b6bc 100644 --- a/dart/lib/src/sentry_measurement_unit.dart +++ b/dart/lib/src/sentry_measurement_unit.dart @@ -1,4 +1,12 @@ +/// The unit of measurement of a metric value. +/// Units augment metric values by giving them a magnitude and semantics. +/// Units and their precisions are uniquely represented by a string identifier. +/// +/// This is a singe enum because Enhanced Enums in Dart is only available +/// in newer versions. enum SentryMeasurementUnit { + /// Duration units + /// Nanosecond (`"nanosecond"`), 10^-9 seconds. nanoSecond, @@ -23,6 +31,58 @@ enum SentryMeasurementUnit { /// Week (`"week"`), 604,800 seconds. week, + /// Information units + + /// Bit (`"bit"`), corresponding to 1/8 of a byte. + bit, + + /// Byte (`"byte"`). + byte, + + /// Kilobyte (`"kilobyte"`), 10^3 bytes. + kiloByte, + + /// Kibibyte (`"kibibyte"`), 2^10 bytes. + kibiByte, + + /// Megabyte (`"megabyte"`), 10^6 bytes. + megaByte, + + /// Mebibyte (`"mebibyte"`), 2^20 bytes. + mebiByte, + + /// Gigabyte (`"gigabyte"`), 10^9 bytes. + gigaByte, + + /// Gibibyte (`"gibibyte"`), 2^30 bytes. + gibiByte, + + /// Terabyte (`"terabyte"`), 10^12 bytes. + teraByte, + + /// Tebibyte (`"tebibyte"`), 2^40 bytes. + tebiByte, + + /// Petabyte (`"petabyte"`), 10^15 bytes. + petaByte, + + /// Pebibyte (`"pebibyte"`), 2^50 bytes. + pebiByte, + + /// Exabyte (`"exabyte"`), 10^18 bytes. + exaByte, + + /// Exbibyte (`"exbibyte"`), 2^60 bytes. + exbiByte, + + /// Fraction units + + /// Floating point fraction of `1`. + ratio, + + /// Ratio expressed as a fraction of `100`. `100%` equals a ratio of `1.0`. + percent, + /// Untyped value without a unit. none, } @@ -30,6 +90,7 @@ enum SentryMeasurementUnit { extension SentryMeasurementUnitExtension on SentryMeasurementUnit { String toStringValue() { switch (this) { + // Duration units case SentryMeasurementUnit.nanoSecond: return 'nanosecond'; case SentryMeasurementUnit.microSecond: @@ -46,6 +107,44 @@ extension SentryMeasurementUnitExtension on SentryMeasurementUnit { return 'day'; case SentryMeasurementUnit.week: return 'week'; + + // Information units + case SentryMeasurementUnit.bit: + return 'bit'; + case SentryMeasurementUnit.byte: + return 'byte'; + case SentryMeasurementUnit.kiloByte: + return 'kilobyte'; + case SentryMeasurementUnit.kibiByte: + return 'kibibyte'; + case SentryMeasurementUnit.megaByte: + return 'megabyte'; + case SentryMeasurementUnit.mebiByte: + return 'mebibyte'; + case SentryMeasurementUnit.gigaByte: + return 'gigabyte'; + case SentryMeasurementUnit.gibiByte: + return 'gibibyte'; + case SentryMeasurementUnit.teraByte: + return 'terabyte'; + case SentryMeasurementUnit.tebiByte: + return 'tebibyte'; + case SentryMeasurementUnit.petaByte: + return 'petabyte'; + case SentryMeasurementUnit.pebiByte: + return 'pebibyte'; + case SentryMeasurementUnit.exaByte: + return 'exabyte'; + case SentryMeasurementUnit.exbiByte: + return 'exbibyte'; + + // Fraction units + case SentryMeasurementUnit.ratio: + return 'ratio'; + case SentryMeasurementUnit.percent: + return 'percent'; + + // Untyped value case SentryMeasurementUnit.none: return 'none'; } diff --git a/dart/lib/src/sentry_tracer.dart b/dart/lib/src/sentry_tracer.dart index d3944d4d60..b404ea8b3e 100644 --- a/dart/lib/src/sentry_tracer.dart +++ b/dart/lib/src/sentry_tracer.dart @@ -291,7 +291,8 @@ class SentryTracer extends ISentrySpan { if (finished) { return; } - final measurement = SentryMeasurement(name, value, unit: unit); + final measurement = + SentryMeasurement(name, value, unit: unit?.toStringValue()); _measurements[name] = measurement; } diff --git a/dart/test/sentry_measurement_test.dart b/dart/test/sentry_measurement_test.dart index 144a8f9b7f..e6b7d9b16d 100644 --- a/dart/test/sentry_measurement_test.dart +++ b/dart/test/sentry_measurement_test.dart @@ -6,31 +6,31 @@ void main() { group('$SentryMeasurement', () { test('total frames has none unit', () { expect( - SentryMeasurement.totalFrames(10).unit, SentryMeasurementUnit.none); + SentryMeasurement.totalFrames(10).unit, SentryMeasurementUnit.none.toStringValue()); }); test('slow frames has none unit', () { - expect(SentryMeasurement.slowFrames(10).unit, SentryMeasurementUnit.none); + expect(SentryMeasurement.slowFrames(10).unit, SentryMeasurementUnit.none.toStringValue()); }); test('frozen frames has none unit', () { expect( - SentryMeasurement.frozenFrames(10).unit, SentryMeasurementUnit.none); + SentryMeasurement.frozenFrames(10).unit, SentryMeasurementUnit.none.toStringValue()); }); test('warm start has milliseconds unit', () { expect(SentryMeasurement.warmAppStart(Duration(seconds: 1)).unit, - SentryMeasurementUnit.milliSecond); + SentryMeasurementUnit.milliSecond.toStringValue()); }); test('cold start has milliseconds unit', () { expect(SentryMeasurement.coldAppStart(Duration(seconds: 1)).unit, - SentryMeasurementUnit.milliSecond); + SentryMeasurementUnit.milliSecond.toStringValue()); }); test('toJson sets unit if given', () { final measurement = SentryMeasurement('name', 10, - unit: SentryMeasurementUnit.milliSecond); + unit: SentryMeasurementUnit.milliSecond.toStringValue()); final map = { 'value': 10, 'unit': 'millisecond', diff --git a/dart/test/sentry_measurement_unit_test.dart b/dart/test/sentry_measurement_unit_test.dart new file mode 100644 index 0000000000..2af0a27aff --- /dev/null +++ b/dart/test/sentry_measurement_unit_test.dart @@ -0,0 +1,110 @@ +import 'package:sentry/sentry.dart'; +import 'package:test/test.dart'; + +void main() { + group('$SentryMeasurementUnit', () { + group('DurationUnit', () { + test('nanosecond', () { + expect(SentryMeasurementUnit.nanoSecond.toStringValue(), 'nanosecond'); + }); + + test('microsecond', () { + expect( + SentryMeasurementUnit.microSecond.toStringValue(), 'microsecond'); + }); + + test('millisecond', () { + expect( + SentryMeasurementUnit.milliSecond.toStringValue(), 'millisecond'); + }); + + test('second', () { + expect(SentryMeasurementUnit.second.toStringValue(), 'second'); + }); + + test('minute', () { + expect(SentryMeasurementUnit.minute.toStringValue(), 'minute'); + }); + + test('hour', () { + expect(SentryMeasurementUnit.hour.toStringValue(), 'hour'); + }); + + test('day', () { + expect(SentryMeasurementUnit.day.toStringValue(), 'day'); + }); + + test('week', () { + expect(SentryMeasurementUnit.week.toStringValue(), 'week'); + }); + }); + + group('FractionUnit', () { + test('ratio', () { + expect(SentryMeasurementUnit.ratio.toStringValue(), 'ratio'); + }); + + test('percent', () { + expect(SentryMeasurementUnit.percent.toStringValue(), 'percent'); + }); + }); + + group('None', () { + test('none', () { + expect(SentryMeasurementUnit.none.toStringValue(), 'none'); + }); + }); + + group('InformationUnit', () { + test('bit', () { + expect(SentryMeasurementUnit.bit.toStringValue(), 'bit'); + }); + + test('byte', () { + expect(SentryMeasurementUnit.byte.toStringValue(), 'byte'); + }); + + test('kilobyte', () { + expect(SentryMeasurementUnit.kiloByte.toStringValue(), 'kilobyte'); + }); + + test('kibibyte', () { + expect(SentryMeasurementUnit.kibiByte.toStringValue(), 'kibibyte'); + }); + + test('megabyte', () { + expect(SentryMeasurementUnit.megaByte.toStringValue(), 'megabyte'); + }); + + test('mebibyte', () { + expect(SentryMeasurementUnit.mebiByte.toStringValue(), 'mebibyte'); + }); + + test('gigabyte', () { + expect(SentryMeasurementUnit.gigaByte.toStringValue(), 'gigabyte'); + }); + + test('gibibyte', () { + expect(SentryMeasurementUnit.gibiByte.toStringValue(), 'gibibyte'); + }); + test('terabyte', () { + expect(SentryMeasurementUnit.teraByte.toStringValue(), 'terabyte'); + }); + test('tebibyte', () { + expect(SentryMeasurementUnit.tebiByte.toStringValue(), 'tebibyte'); + }); + test('petabyte', () { + expect(SentryMeasurementUnit.petaByte.toStringValue(), 'petabyte'); + }); + test('pebibyte', () { + expect(SentryMeasurementUnit.pebiByte.toStringValue(), 'pebibyte'); + }); + test('exabyte', () { + expect(SentryMeasurementUnit.exaByte.toStringValue(), 'exabyte'); + }); + test('exbibyte', () { + expect(SentryMeasurementUnit.exbiByte.toStringValue(), 'exbibyte'); + }); + }); + }); +} From fc4630cc5c4f4f6e461af848b2375a3b0ca7e0d7 Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto Date: Fri, 30 Sep 2022 12:01:06 +0200 Subject: [PATCH 2/3] pr id --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1e89917ea..e44fb822c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ ### Fixes - Tracer does not allow setting measurement if finished ([#1026](https://github.com/getsentry/sentry-dart/pull/1026)) -- Add missing measurements units +- Add missing measurements units ([#1033](https://github.com/getsentry/sentry-dart/pull/1033)) ### Features From fad9d52bb9497d14d7677e9065bc7bcf755875d5 Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto Date: Fri, 30 Sep 2022 12:16:28 +0200 Subject: [PATCH 3/3] fix --- dart/lib/src/sentry_measurement.dart | 14 +++++++------- dart/lib/src/sentry_tracer.dart | 3 +-- dart/test/sentry_measurement_test.dart | 12 ++++++------ 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/dart/lib/src/sentry_measurement.dart b/dart/lib/src/sentry_measurement.dart index 89452f3ded..d7c568ee29 100644 --- a/dart/lib/src/sentry_measurement.dart +++ b/dart/lib/src/sentry_measurement.dart @@ -10,43 +10,43 @@ class SentryMeasurement { /// Amount of frames drawn during a transaction SentryMeasurement.totalFrames(this.value) : name = 'frames_total', - unit = SentryMeasurementUnit.none.toStringValue(); + unit = SentryMeasurementUnit.none; /// Amount of slow frames drawn during a transaction. /// A slow frame is any frame longer than 1s / refreshrate. /// So for example any frame slower than 16ms for a refresh rate of 60hz. SentryMeasurement.slowFrames(this.value) : name = 'frames_slow', - unit = SentryMeasurementUnit.none.toStringValue(); + unit = SentryMeasurementUnit.none; /// Amount of frozen frames drawn during a transaction. /// Typically defined as frames slower than 500ms. SentryMeasurement.frozenFrames(this.value) : name = 'frames_frozen', - unit = SentryMeasurementUnit.none.toStringValue(); + unit = SentryMeasurementUnit.none; /// Duration of the Cold App start in milliseconds SentryMeasurement.coldAppStart(Duration duration) : assert(!duration.isNegative), name = 'app_start_cold', value = duration.inMilliseconds, - unit = SentryMeasurementUnit.milliSecond.toStringValue(); + unit = SentryMeasurementUnit.milliSecond; /// Duration of the Warm App start in milliseconds SentryMeasurement.warmAppStart(Duration duration) : assert(!duration.isNegative), name = 'app_start_warm', value = duration.inMilliseconds, - unit = SentryMeasurementUnit.milliSecond.toStringValue(); + unit = SentryMeasurementUnit.milliSecond; final String name; final num value; - final String? unit; + final SentryMeasurementUnit? unit; Map toJson() { return { 'value': value, - if (unit != null) 'unit': unit, + if (unit != null) 'unit': unit?.toStringValue(), }; } } diff --git a/dart/lib/src/sentry_tracer.dart b/dart/lib/src/sentry_tracer.dart index b404ea8b3e..d3944d4d60 100644 --- a/dart/lib/src/sentry_tracer.dart +++ b/dart/lib/src/sentry_tracer.dart @@ -291,8 +291,7 @@ class SentryTracer extends ISentrySpan { if (finished) { return; } - final measurement = - SentryMeasurement(name, value, unit: unit?.toStringValue()); + final measurement = SentryMeasurement(name, value, unit: unit); _measurements[name] = measurement; } diff --git a/dart/test/sentry_measurement_test.dart b/dart/test/sentry_measurement_test.dart index e6b7d9b16d..144a8f9b7f 100644 --- a/dart/test/sentry_measurement_test.dart +++ b/dart/test/sentry_measurement_test.dart @@ -6,31 +6,31 @@ void main() { group('$SentryMeasurement', () { test('total frames has none unit', () { expect( - SentryMeasurement.totalFrames(10).unit, SentryMeasurementUnit.none.toStringValue()); + SentryMeasurement.totalFrames(10).unit, SentryMeasurementUnit.none); }); test('slow frames has none unit', () { - expect(SentryMeasurement.slowFrames(10).unit, SentryMeasurementUnit.none.toStringValue()); + expect(SentryMeasurement.slowFrames(10).unit, SentryMeasurementUnit.none); }); test('frozen frames has none unit', () { expect( - SentryMeasurement.frozenFrames(10).unit, SentryMeasurementUnit.none.toStringValue()); + SentryMeasurement.frozenFrames(10).unit, SentryMeasurementUnit.none); }); test('warm start has milliseconds unit', () { expect(SentryMeasurement.warmAppStart(Duration(seconds: 1)).unit, - SentryMeasurementUnit.milliSecond.toStringValue()); + SentryMeasurementUnit.milliSecond); }); test('cold start has milliseconds unit', () { expect(SentryMeasurement.coldAppStart(Duration(seconds: 1)).unit, - SentryMeasurementUnit.milliSecond.toStringValue()); + SentryMeasurementUnit.milliSecond); }); test('toJson sets unit if given', () { final measurement = SentryMeasurement('name', 10, - unit: SentryMeasurementUnit.milliSecond.toStringValue()); + unit: SentryMeasurementUnit.milliSecond); final map = { 'value': 10, 'unit': 'millisecond',