Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file | |
| 4 | |
| 5 part of repositories; | |
| 6 | |
| 7 class Metric implements M.Metric { | |
| 8 final String id; | |
| 9 String get name => internal.name; | |
| 10 String get description => internal.description; | |
| 11 final internal; | |
| 12 | |
| 13 Metric(this.id, this.internal); | |
| 14 } | |
| 15 | |
| 16 class MetricSample implements M.MetricSample { | |
| 17 final double value; | |
| 18 final DateTime time = new DateTime.now(); | |
| 19 MetricSample(this.value); | |
| 20 } | |
| 21 | |
| 22 class MetricRepository implements M.MetricRepository { | |
| 23 final Map<S.Isolate, Map<Metric, List<M.MetricSample>>> _samples | |
| 24 = <S.Isolate, Map<Metric, List<M.MetricSample>>>{}; | |
| 25 final Map<S.Isolate, Map<Metric, int>> _rates | |
| 26 = <S.Isolate, Map<Metric, int>>{}; | |
| 27 final Map<S.Isolate, Map<Metric, int>> _sizes | |
| 28 = <S.Isolate, Map<Metric, int>>{}; | |
| 29 Timer _timer; | |
| 30 int count = 0; | |
| 31 | |
| 32 Future<Iterable<Metric>> list(M.IsolateRef i) async{ | |
| 33 S.Isolate isolate = i as S.Isolate; | |
| 34 assert(isolate != null); | |
| 35 if (_samples.containsKey(isolate)) { | |
| 36 return _samples[isolate].keys; | |
| 37 } | |
| 38 return const []; | |
| 39 } | |
| 40 | |
| 41 Future startSampling(M.IsolateRef i) async { | |
| 42 S.Isolate isolate = i as S.Isolate; | |
| 43 assert(isolate != null); | |
| 44 if (!_samples.containsKey(isolate)) { | |
| 45 await isolate.refreshMetrics(); | |
| 46 final samples = _samples[isolate] = <Metric, List<M.MetricSample>>{}; | |
| 47 final rates = _rates[isolate] = <Metric, int>{}; | |
| 48 final sizes = _sizes[isolate] = <Metric, int>{}; | |
| 49 final metrics = [] | |
| 50 ..addAll(isolate.dartMetrics.keys.map((name) => | |
| 51 new Metric(name, isolate.dartMetrics[name])).toList()) | |
| 52 ..addAll(isolate.nativeMetrics.keys.map((name) => | |
| 53 new Metric(name, isolate.nativeMetrics[name])).toList()); | |
| 54 for (final metric in metrics) { | |
| 55 samples[metric] = [new MetricSample(metric.internal.value)]; | |
| 56 rates[metric] = _rateToInteger(M.MetricSamplingRate.off); | |
| 57 sizes[metric] = _sizeToInteger(M.MetricBufferSize.n100samples); | |
| 58 } | |
| 59 if (_samples.length == 1) { | |
| 60 count = 0; | |
| 61 _timer = new Timer.periodic(new Duration(milliseconds: 100), _update); | |
| 62 } | |
| 63 } | |
| 64 } | |
| 65 | |
| 66 Future stopSampling(M.IsolateRef isolate) async { | |
| 67 if (_samples.containsKey(isolate)) { | |
| 68 _samples.remove(isolate); | |
| 69 _rates.remove(isolate); | |
| 70 _sizes.remove(isolate); | |
| 71 if (_samples.isEmpty) { | |
| 72 _timer.cancel(); | |
| 73 } | |
| 74 } | |
| 75 } | |
| 76 | |
| 77 M.MetricSamplingRate getSamplingRate(M.IsolateRef i, M.Metric m) { | |
| 78 if (_rates.containsKey(i)) { | |
| 79 final metrics = _rates[i]; | |
| 80 if (metrics.containsKey(m)) { | |
| 81 switch (metrics[m]) { | |
| 82 case 0: return M.MetricSamplingRate.off; | |
| 83 case 1: return M.MetricSamplingRate.e100ms; | |
| 84 case 10: return M.MetricSamplingRate.e1s; | |
| 85 case 20: return M.MetricSamplingRate.e2s; | |
| 86 case 40: return M.MetricSamplingRate.e4s; | |
| 87 case 80: return M.MetricSamplingRate.e8s; | |
| 88 }; | |
|
rmacnak
2016/09/06 16:46:04
switch doesn't need trailing
cbernaschina
2016/09/06 16:51:40
Done.
| |
| 89 } | |
| 90 } | |
| 91 throw new Exception('Sampling for isolate ${i.id} is not started'); | |
| 92 } | |
| 93 | |
| 94 void setSamplingRate(M.IsolateRef i, M.Metric m, M.MetricSamplingRate r) { | |
| 95 if (_rates.containsKey(i)) { | |
| 96 final metrics = _rates[i]; | |
| 97 if (metrics.containsKey(m)) { | |
| 98 metrics[m] = _rateToInteger(r); | |
| 99 } | |
| 100 } else { | |
| 101 throw new Exception('Sampling for isolate ${i.id} is not started'); | |
| 102 } | |
| 103 } | |
| 104 | |
| 105 M.MetricBufferSize getBufferSize(M.IsolateRef i, M.Metric m) { | |
| 106 if (_sizes.containsKey(i)) { | |
| 107 final metrics = _sizes[i]; | |
| 108 if (metrics.containsKey(m)) { | |
| 109 switch (metrics[m]) { | |
| 110 case 10: return M.MetricBufferSize.n10samples; | |
| 111 case 100: return M.MetricBufferSize.n100samples; | |
| 112 case 1000: return M.MetricBufferSize.n1000samples; | |
| 113 }; | |
|
rmacnak
2016/09/06 16:46:04
"
cbernaschina
2016/09/06 16:51:40
Done.
| |
| 114 } | |
| 115 } | |
| 116 throw new Exception('Sampling for isolate ${i.id} is not started'); | |
| 117 } | |
| 118 | |
| 119 void setBufferSize(M.IsolateRef i, M.Metric m, M.MetricBufferSize s) { | |
| 120 if (_sizes.containsKey(i)) { | |
| 121 final metrics = _sizes[i]; | |
| 122 if (metrics.containsKey(m)) { | |
| 123 metrics[m] = _sizeToInteger(s); | |
| 124 } | |
| 125 } else { | |
| 126 throw new Exception('Sampling for isolate ${i.id} is not started'); | |
| 127 } | |
| 128 } | |
| 129 | |
| 130 static int _rateToInteger(M.MetricSamplingRate r) { | |
| 131 switch (r) { | |
| 132 case M.MetricSamplingRate.off: return 0; | |
| 133 case M.MetricSamplingRate.e100ms: return 1; | |
| 134 case M.MetricSamplingRate.e1s: return 10; | |
| 135 case M.MetricSamplingRate.e2s: return 20; | |
| 136 case M.MetricSamplingRate.e4s: return 40; | |
| 137 case M.MetricSamplingRate.e8s: return 80; | |
| 138 }; | |
|
rmacnak
2016/09/06 16:46:04
"
cbernaschina
2016/09/06 16:51:40
Done.
| |
| 139 throw new Exception('Unknown MetricSamplingRate ($r)'); | |
| 140 } | |
| 141 | |
| 142 static int _sizeToInteger(M.MetricBufferSize s) { | |
| 143 switch (s) { | |
| 144 case M.MetricBufferSize.n10samples: return 10; | |
| 145 case M.MetricBufferSize.n100samples: return 100; | |
| 146 case M.MetricBufferSize.n1000samples: return 1000; | |
| 147 }; | |
|
rmacnak
2016/09/06 16:46:04
"
cbernaschina
2016/09/06 16:51:40
Done.
| |
| 148 throw new Exception('Unknown MetricBufferSize ($s)'); | |
| 149 } | |
| 150 | |
| 151 Iterable<M.MetricSample> getSamples(M.IsolateRef i, M.Metric m) { | |
| 152 if (_samples.containsKey(i)) { | |
| 153 final metrics = _samples[i]; | |
| 154 if (metrics.containsKey(m)) { | |
| 155 return metrics[m]; | |
| 156 } | |
| 157 } | |
| 158 return null; | |
| 159 } | |
| 160 | |
| 161 double getMinValue(M.IsolateRef i, M.Metric m) { | |
| 162 Metric metric = m as Metric; | |
| 163 assert(metric != null); | |
| 164 return metric.internal.min; | |
| 165 } | |
| 166 | |
| 167 double getMaxValue(M.IsolateRef i, M.Metric m) { | |
| 168 Metric metric = m as Metric; | |
| 169 assert(metric != null); | |
| 170 return metric.internal.max; | |
| 171 } | |
| 172 | |
| 173 void _update(_) { | |
| 174 for (final isolate in _rates.keys) { | |
| 175 final metrics = _rates[isolate]; | |
| 176 for (final metric in metrics.keys) { | |
| 177 final rate = metrics[metric]; | |
| 178 if (rate != 0 && count % rate == 0) { | |
| 179 final size = _sizes[isolate][metric]; | |
| 180 final samples = _samples[isolate][metric]; | |
| 181 metric.internal.reload().then((m) { | |
| 182 if (samples.length >= size) { | |
| 183 samples.removeRange(0, samples.length - size + 1); | |
| 184 } | |
| 185 samples.add(new MetricSample(m.value)); | |
| 186 }); | |
| 187 } | |
| 188 } | |
| 189 } | |
| 190 ++count; | |
| 191 } | |
| 192 } | |
| OLD | NEW |