| Index: tracing/tracing/metrics/metric_map_function.html
|
| diff --git a/tracing/tracing/metrics/metric_map_function.html b/tracing/tracing/metrics/metric_map_function.html
|
| index a4f10972021338995dade1d19d7067bd850cbee3..1624436520901a545356c333e2e537bb5fbe5b27 100644
|
| --- a/tracing/tracing/metrics/metric_map_function.html
|
| +++ b/tracing/tracing/metrics/metric_map_function.html
|
| @@ -21,27 +21,70 @@ tr.exportTo('tr.metrics', function() {
|
| * @return {!tr.v.HistogramSet}
|
| */
|
| function runMetrics(model, options) {
|
| - if (options === undefined)
|
| + if (options === undefined) {
|
| throw new Error('Options are required.');
|
| + }
|
|
|
| var metricNames = options.metrics;
|
| - if (!metricNames)
|
| + if (!metricNames) {
|
| throw new Error('Metric names should be specified.');
|
| + }
|
|
|
| var histograms = new tr.v.HistogramSet();
|
|
|
| + var metrics = [];
|
| for (var metricName of metricNames) {
|
| var metric = tr.metrics.MetricRegistry.findTypeInfoWithName(metricName);
|
| - if (metric === undefined)
|
| + if (metric === undefined) {
|
| throw new Error('"' + metricName + '" is not a registered metric.');
|
| - metric.constructor(histograms, model, options);
|
| + }
|
| + metrics.push(metric);
|
| + try {
|
| + metric.constructor(histograms, model, options);
|
| + } catch (e) {
|
| + synthesizeFailureHistograms(histograms, metric, e);
|
| + }
|
| }
|
|
|
| + validateHistogramNames(histograms, metrics);
|
| +
|
| return histograms;
|
| }
|
|
|
| /**
|
| * @param {!tr.v.HistogramSet} histograms
|
| + * @param {!Array.<!tr.b.RegisteredTypeInfo>} metrics
|
| + */
|
| + function validateHistogramNames(histograms, metrics) {
|
| + var registeredHistogramNames = new Set();
|
| + for (var metric of metrics) {
|
| + for (var name of metric.metadata.histogramNames) {
|
| + registeredHistogramNames.add(name);
|
| + }
|
| + }
|
| + for (var hist of histograms) {
|
| + if (!registeredHistogramNames.has(hist.name)) {
|
| + throw new Error('"' + hist.name +
|
| + '" is not a registered histogram name.');
|
| + }
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!tr.v.HistogramSet} histograms
|
| + * @param {!tr.b.RegisteredTypeInfo} metric
|
| + * @param {!Error} error
|
| + */
|
| + function synthesizeFailureHistograms(histograms, metric, error) {
|
| + for (var name of metric.metadata.histogramNames) {
|
| + var hist = new tr.v.Histogram(name, tr.b.Unit.byName.unitlessNumber);
|
| + // TODO(benjhayden): add a FailureInfo containing |error|.
|
| + histograms.addHistogram(hist);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!tr.v.HistogramSet} histograms
|
| * @param {!tr.model.Model} model
|
| */
|
| function addTelemetryInfo(histograms, model) {
|
|
|