mirror of
https://github.com/dart-lang/sdk
synced 2024-11-02 10:49:00 +00:00
75de086f1d
performNnbdChecks is turned on. Bug:40424 Change-Id: I97a283c4a2d54f570def04d938baa9a4ced08667 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137250 Commit-Queue: Siva Annamalai <asiva@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com>
153 lines
4.1 KiB
Dart
153 lines
4.1 KiB
Dart
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
part of dart.developer;
|
|
|
|
/// A UserTag can be used to group samples in the Observatory profiler.
|
|
abstract class UserTag {
|
|
/// The maximum number of UserTag instances that can be created by a program.
|
|
static const MAX_USER_TAGS = 64;
|
|
|
|
external factory UserTag(String label);
|
|
|
|
/// Label of [this].
|
|
String get label;
|
|
|
|
/// Make [this] the current tag for the isolate. Returns the current tag
|
|
/// before setting.
|
|
UserTag makeCurrent();
|
|
|
|
/// The default [UserTag] with label 'Default'.
|
|
external static UserTag get defaultTag;
|
|
}
|
|
|
|
/// Returns the current [UserTag] for the isolate.
|
|
external UserTag getCurrentTag();
|
|
|
|
/// Abstract [Metric] class. Metric names must be unique, are hierarchical,
|
|
/// and use periods as separators. For example, 'a.b.c'. Uniqueness is only
|
|
/// enforced when a Metric is registered. The name of a metric cannot contain
|
|
/// the slash ('/') character.
|
|
abstract class Metric {
|
|
/// [name] of this metric.
|
|
final String name;
|
|
|
|
/// [description] of this metric.
|
|
final String description;
|
|
|
|
Metric(this.name, this.description) {
|
|
if ((name == 'vm') || name.contains('/')) {
|
|
throw new ArgumentError('Invalid Metric name.');
|
|
}
|
|
}
|
|
|
|
Map _toJSON();
|
|
}
|
|
|
|
/// A measured value with a min and max. Initial value is min. Value will
|
|
/// be clamped to the interval [min, max].
|
|
class Gauge extends Metric {
|
|
final double min;
|
|
final double max;
|
|
|
|
double _value;
|
|
double get value => _value;
|
|
set value(double v) {
|
|
if (v < min) {
|
|
v = min;
|
|
} else if (v > max) {
|
|
v = max;
|
|
}
|
|
_value = v;
|
|
}
|
|
|
|
Gauge(String name, String description, this.min, this.max)
|
|
: _value = min,
|
|
super(name, description) {
|
|
// TODO: When NNBD is complete, delete the following two lines.
|
|
ArgumentError.checkNotNull(min, 'min');
|
|
ArgumentError.checkNotNull(max, 'max');
|
|
if (!(min < max)) throw new ArgumentError('min must be less than max');
|
|
}
|
|
|
|
Map _toJSON() {
|
|
var map = {
|
|
'type': 'Gauge',
|
|
'id': 'metrics/$name',
|
|
'name': name,
|
|
'description': description,
|
|
'value': value,
|
|
'min': min,
|
|
'max': max,
|
|
};
|
|
return map;
|
|
}
|
|
}
|
|
|
|
/// A changing value. Initial value is 0.0.
|
|
class Counter extends Metric {
|
|
Counter(String name, String description) : super(name, description);
|
|
|
|
double _value = 0.0;
|
|
double get value => _value;
|
|
set value(double v) {
|
|
_value = v;
|
|
}
|
|
|
|
Map _toJSON() {
|
|
var map = {
|
|
'type': 'Counter',
|
|
'id': 'metrics/$name',
|
|
'name': name,
|
|
'description': description,
|
|
'value': value,
|
|
};
|
|
return map;
|
|
}
|
|
}
|
|
|
|
class Metrics {
|
|
static final Map<String, Metric> _metrics = new Map<String, Metric>();
|
|
|
|
/// Register [Metric]s to make them visible to Observatory.
|
|
static void register(Metric metric) {
|
|
// TODO: When NNBD is complete, delete the following line.
|
|
ArgumentError.checkNotNull(metric, 'metric');
|
|
if (_metrics[metric.name] != null) {
|
|
throw new ArgumentError('Registered metrics have unique names');
|
|
}
|
|
_metrics[metric.name] = metric;
|
|
}
|
|
|
|
/// Deregister [Metric]s to make them not visible to Observatory.
|
|
static void deregister(Metric metric) {
|
|
// TODO: When NNBD is complete, delete the following line.
|
|
ArgumentError.checkNotNull(metric, 'metric');
|
|
_metrics.remove(metric.name);
|
|
}
|
|
|
|
// ignore: unused_element, called from native code
|
|
@pragma("vm:entry-point", !const bool.fromEnvironment("dart.vm.product"))
|
|
static String? _printMetric(String id) {
|
|
var metric = _metrics[id];
|
|
if (metric == null) {
|
|
return null;
|
|
}
|
|
return json.encode(metric._toJSON());
|
|
}
|
|
|
|
// ignore: unused_element, called from native code
|
|
@pragma("vm:entry-point", !const bool.fromEnvironment("dart.vm.product"))
|
|
static String _printMetrics() {
|
|
var metrics = [];
|
|
for (var metric in _metrics.values) {
|
|
metrics.add(metric._toJSON());
|
|
}
|
|
var map = {
|
|
'type': 'MetricList',
|
|
'metrics': metrics,
|
|
};
|
|
return json.encode(map);
|
|
}
|
|
}
|