Skip to content

Commit a75ded6

Browse files
committed
[ VM / Service ] Made VM timeline functionality public through the service API.
Change-Id: I8228f0417047af53edc6f570940d452da3155bbd Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/106061 Reviewed-by: Siva Annamalai <asiva@google.com>
1 parent 5dc14be commit a75ded6

File tree

16 files changed

+287
-54
lines changed

16 files changed

+287
-54
lines changed

runtime/observatory/lib/src/repositories/timeline.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,21 @@ part of repositories;
77
class TimelineRepository implements M.TimelineRepository {
88
Future<M.TimelineFlags> getFlags(M.VMRef ref) async {
99
S.VM vm = ref as S.VM;
10-
S.ServiceMap response = await vm.invokeRpc('_getVMTimelineFlags', {});
10+
S.ServiceMap response = await vm.invokeRpc('getVMTimelineFlags', {});
1111
return new S.TimelineFlags(response);
1212
}
1313

1414
Future setRecordedStreams(M.VMRef ref, Iterable<M.TimelineStream> streams) {
1515
S.VM vm = ref as S.VM;
1616
assert(vm != null);
17-
return vm.invokeRpc('_setVMTimelineFlags', {
17+
return vm.invokeRpc('setVMTimelineFlags', {
1818
'recordedStreams': '[${streams.map((s) => s.name).join(', ')}]',
1919
});
2020
}
2121

2222
Future clear(M.VMRef ref) {
2323
S.VM vm = ref as S.VM;
24-
return vm.invokeRpc('_clearVMTimeline', {});
24+
return vm.invokeRpc('clearVMTimeline', {});
2525
}
2626

2727
Future<Map<String, dynamic>> getIFrameParams(M.VMRef ref) async {

runtime/observatory/tests/service/get_version_rpc_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var tests = <VMTest>[
1212
var result = await vm.invokeRpcNoUpgrade('getVersion', {});
1313
expect(result['type'], equals('Version'));
1414
expect(result['major'], equals(3));
15-
expect(result['minor'], equals(18));
15+
expect(result['minor'], equals(19));
1616
expect(result['_privateMajor'], equals(0));
1717
expect(result['_privateMinor'], equals(0));
1818
},

runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,14 @@ void allEventsHaveIsolateNumber(List events) {
9494
}
9595
Map arguments = event['args'];
9696
expect(arguments, new isInstanceOf<Map>());
97-
expect(arguments['isolateNumber'], new isInstanceOf<String>());
97+
expect(arguments['isolateId'], new isInstanceOf<String>());
9898
}
9999
}
100100

101101
var tests = <VMTest>[
102102
(VM vm) async {
103-
Map result = await vm.invokeRpcNoUpgrade('_getVMTimeline', {});
104-
expect(result['type'], equals('_Timeline'));
103+
Map result = await vm.invokeRpcNoUpgrade('getVMTimeline', {});
104+
expect(result['type'], equals('Timeline'));
105105
expect(result['traceEvents'], new isInstanceOf<List>());
106106
final int numEvents = result['traceEvents'].length;
107107
List dartEvents = filterForDartEvents(result['traceEvents']);
@@ -121,7 +121,7 @@ var tests = <VMTest>[
121121
int origin = timeOrigin(dartEvents);
122122
int extent = timeDuration(dartEvents, origin);
123123
// Query for the timeline with the time window for Dart events.
124-
result = await vm.invokeRpcNoUpgrade('_getVMTimeline',
124+
result = await vm.invokeRpcNoUpgrade('getVMTimeline',
125125
{'timeOriginMicros': origin, 'timeExtentMicros': extent});
126126
// Verify that we received fewer events than before.
127127
expect(result['traceEvents'].length, lessThan(numEvents));

runtime/observatory/tests/service/vm_timeline_events_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ var tests = <IsolateTest>[
4545
},
4646
(Isolate isolate) async {
4747
// Get the flags.
48-
Map flags = await isolate.vm.invokeRpcNoUpgrade('_getVMTimelineFlags', {});
48+
Map flags = await isolate.vm.invokeRpcNoUpgrade('getVMTimelineFlags', {});
4949
expect(flags['type'], 'TimelineFlags');
5050
// Confirm that 'Dart' is available.
5151
expect(flags['availableStreams'].contains('Dart'), isTrue);
@@ -54,7 +54,7 @@ var tests = <IsolateTest>[
5454
},
5555
(Isolate isolate) async {
5656
// Enable the Dart category.
57-
await isolate.vm.invokeRpcNoUpgrade('_setVMTimelineFlags', {
57+
await isolate.vm.invokeRpcNoUpgrade('setVMTimelineFlags', {
5858
"recordedStreams": ["Dart"]
5959
});
6060
},

runtime/observatory/tests/service/vm_timeline_flags_test.dart

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ var tests = <IsolateTest>[
3131
hasStoppedAtBreakpoint,
3232
(Isolate isolate) async {
3333
// Get the flags.
34-
Map flags = await isolate.vm.invokeRpcNoUpgrade('_getVMTimelineFlags', {});
34+
Map flags = await isolate.vm.invokeRpcNoUpgrade('getVMTimelineFlags', {});
3535
expect(flags['type'], 'TimelineFlags');
3636
// Confirm that 'Dart' is available.
3737
expect(flags['availableStreams'].contains('Dart'), isTrue);
@@ -40,21 +40,21 @@ var tests = <IsolateTest>[
4040
},
4141
(Isolate isolate) async {
4242
// Get the timeline.
43-
Map result = await isolate.vm.invokeRpcNoUpgrade('_getVMTimeline', {});
44-
expect(result['type'], equals('_Timeline'));
43+
Map result = await isolate.vm.invokeRpcNoUpgrade('getVMTimeline', {});
44+
expect(result['type'], equals('Timeline'));
4545
expect(result['traceEvents'], new isInstanceOf<List>());
4646
// Confirm that it as no non-meta data events.
4747
expect(filterEvents(result['traceEvents'], isNotMetaData).length, 0);
4848
},
4949
(Isolate isolate) async {
5050
// Enable the Dart category.
51-
await isolate.vm.invokeRpcNoUpgrade('_setVMTimelineFlags', {
51+
await isolate.vm.invokeRpcNoUpgrade('setVMTimelineFlags', {
5252
"recordedStreams": ["Dart"]
5353
});
5454
},
5555
(Isolate isolate) async {
5656
// Get the flags.
57-
Map flags = await isolate.vm.invokeRpcNoUpgrade('_getVMTimelineFlags', {});
57+
Map flags = await isolate.vm.invokeRpcNoUpgrade('getVMTimelineFlags', {});
5858
expect(flags['type'], 'TimelineFlags');
5959
// Confirm that only Dart is being recorded.
6060
expect(flags['recordedStreams'].length, equals(1));
@@ -65,8 +65,8 @@ var tests = <IsolateTest>[
6565
hasStoppedAtBreakpoint,
6666
(Isolate isolate) async {
6767
// Get the timeline.
68-
Map result = await isolate.vm.invokeRpcNoUpgrade('_getVMTimeline', {});
69-
expect(result['type'], equals('_Timeline'));
68+
Map result = await isolate.vm.invokeRpcNoUpgrade('getVMTimeline', {});
69+
expect(result['type'], equals('Timeline'));
7070
expect(result['traceEvents'], new isInstanceOf<List>());
7171
print(result['traceEvents']);
7272
// Confirm that Dart events are added.
@@ -79,16 +79,16 @@ var tests = <IsolateTest>[
7979
(Isolate isolate) async {
8080
// Disable the Dart category.
8181
await isolate.vm
82-
.invokeRpcNoUpgrade('_setVMTimelineFlags', {"recordedStreams": []});
82+
.invokeRpcNoUpgrade('setVMTimelineFlags', {"recordedStreams": []});
8383
// Grab the timeline and remember the number of Dart events.
84-
Map result = await isolate.vm.invokeRpcNoUpgrade('_getVMTimeline', {});
85-
expect(result['type'], equals('_Timeline'));
84+
Map result = await isolate.vm.invokeRpcNoUpgrade('getVMTimeline', {});
85+
expect(result['type'], equals('Timeline'));
8686
expect(result['traceEvents'], new isInstanceOf<List>());
8787
dartEventCount = filterEvents(result['traceEvents'], isDart).length;
8888
},
8989
(Isolate isolate) async {
9090
// Get the flags.
91-
Map flags = await isolate.vm.invokeRpcNoUpgrade('_getVMTimelineFlags', {});
91+
Map flags = await isolate.vm.invokeRpcNoUpgrade('getVMTimelineFlags', {});
9292
expect(flags['type'], 'TimelineFlags');
9393
// Confirm that 'Dart' is not being recorded.
9494
expect(flags['recordedStreams'].length, equals(0));
@@ -97,8 +97,8 @@ var tests = <IsolateTest>[
9797
hasStoppedAtBreakpoint,
9898
(Isolate isolate) async {
9999
// Grab the timeline and verify that we haven't added any new Dart events.
100-
Map result = await isolate.vm.invokeRpcNoUpgrade('_getVMTimeline', {});
101-
expect(result['type'], equals('_Timeline'));
100+
Map result = await isolate.vm.invokeRpcNoUpgrade('getVMTimeline', {});
101+
expect(result['type'], equals('Timeline'));
102102
expect(result['traceEvents'], new isInstanceOf<List>());
103103
expect(filterEvents(result['traceEvents'], isDart).length, dartEventCount);
104104
// Confirm that zero non-Dart events are added.

runtime/observatory/tests/service/write_cpu_profile_timeline_rpc_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ var tests = <IsolateTest>[
2727
print(result);
2828
expect(result['type'], equals('Success'));
2929

30-
result = await isolate.vm.invokeRpcNoUpgrade('_getVMTimeline', {});
31-
expect(result['type'], equals('_Timeline'));
30+
result = await isolate.vm.invokeRpcNoUpgrade('getVMTimeline', {});
31+
expect(result['type'], equals('Timeline'));
3232
expect(result['traceEvents'], new isInstanceOf<List>());
3333

3434
var events = result['traceEvents'];

runtime/vm/json_stream.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ static const char* GetJSONRpcErrorMessage(intptr_t code) {
136136
return "File system does not exist";
137137
case kFileDoesNotExist:
138138
return "File does not exist";
139+
case kInvalidTimelineRequest:
140+
return "The timeline related request could not be completed due to the "
141+
"current configuration";
139142
default:
140143
return "Extension error";
141144
}

runtime/vm/json_stream.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ enum JSONRpcErrorCode {
6161
kServiceAlreadyRegistered = 111,
6262
kServiceDisappeared = 112,
6363
kExpressionCompilationError = 113,
64+
kInvalidTimelineRequest = 114,
6465

6566
// Experimental (used in private rpcs).
6667
kFileSystemAlreadyExists = 1001,

runtime/vm/service.cc

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3656,6 +3656,18 @@ static bool GetVMTimeline(Thread* thread, JSONStream* js) {
36563656
TimelineEventRecorder* timeline_recorder = Timeline::recorder();
36573657
// TODO(johnmccutchan): Return an error.
36583658
ASSERT(timeline_recorder != NULL);
3659+
const char* name = timeline_recorder->name();
3660+
if ((strcmp(name, FUCHSIA_RECORDER_NAME) == 0) ||
3661+
(strcmp(name, SYSTRACE_RECORDER_NAME) == 0)) {
3662+
js->PrintError(kInvalidTimelineRequest,
3663+
"A recorder of type \"%s\" is "
3664+
"currently in use. As a result, timeline events are handled "
3665+
"by the OS rather than the VM. See the VM service "
3666+
"documentation for more details on where timeline events "
3667+
"can be found for this recorder type.",
3668+
timeline_recorder->name());
3669+
return true;
3670+
}
36593671
int64_t time_origin_micros =
36603672
Int64Parameter::Parse(js->LookupParam("timeOriginMicros"));
36613673
int64_t time_extent_micros =
@@ -4882,7 +4894,7 @@ static const ServiceMethodDescriptor service_methods_[] = {
48824894
build_expression_evaluation_scope_params },
48834895
{ "_clearCpuProfile", ClearCpuProfile,
48844896
clear_cpu_profile_params },
4885-
{ "_clearVMTimeline", ClearVMTimeline,
4897+
{ "clearVMTimeline", ClearVMTimeline,
48864898
clear_vm_timeline_params, },
48874899
{ "_compileExpression", CompileExpression, compile_expression_params },
48884900
{ "_enableProfiler", EnableProfiler,
@@ -4959,9 +4971,9 @@ static const ServiceMethodDescriptor service_methods_[] = {
49594971
get_vm_metric_params },
49604972
{ "_getVMMetricList", GetVMMetricList,
49614973
get_vm_metric_list_params },
4962-
{ "_getVMTimeline", GetVMTimeline,
4974+
{ "getVMTimeline", GetVMTimeline,
49634975
get_vm_timeline_params },
4964-
{ "_getVMTimelineFlags", GetVMTimelineFlags,
4976+
{ "getVMTimelineFlags", GetVMTimelineFlags,
49654977
get_vm_timeline_flags_params },
49664978
{ "invoke", Invoke, invoke_params },
49674979
{ "kill", Kill, kill_params },
@@ -4991,7 +5003,7 @@ static const ServiceMethodDescriptor service_methods_[] = {
49915003
set_trace_class_allocation_params },
49925004
{ "setVMName", SetVMName,
49935005
set_vm_name_params },
4994-
{ "_setVMTimelineFlags", SetVMTimelineFlags,
5006+
{ "setVMTimelineFlags", SetVMTimelineFlags,
49955007
set_vm_timeline_flags_params },
49965008
{ "_collectAllGarbage", CollectAllGarbage,
49975009
collect_all_garbage_params },

runtime/vm/service.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
namespace dart {
1616

1717
#define SERVICE_PROTOCOL_MAJOR_VERSION 3
18-
#define SERVICE_PROTOCOL_MINOR_VERSION 18
18+
#define SERVICE_PROTOCOL_MINOR_VERSION 19
1919

2020
class Array;
2121
class EmbedderServiceHandler;

0 commit comments

Comments
 (0)