blob: d63f5bb69feddcd072fbe76f1186c45d7f19520a [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
syntax = "proto2";
import "protos/perfetto/common/commit_data_request.proto";
import "protos/perfetto/config/data_source_config.proto";
import "protos/perfetto/common/data_source_descriptor.proto";
package perfetto.protos;
// IPC interface definition for the producer port of the tracing service.
service ProducerPort {
// Called once only after establishing the connection with the Service.
// The service replies sending the shared memory file descriptor in reply.
rpc InitializeConnection(InitializeConnectionRequest)
returns (InitializeConnectionResponse) {}
// Advertises a new data source.
rpc RegisterDataSource(RegisterDataSourceRequest)
returns (RegisterDataSourceResponse) {}
// Unregisters a previously registered data source.
rpc UnregisterDataSource(UnregisterDataSourceRequest)
returns (UnregisterDataSourceResponse) {}
// Sent by the client to request the service to:
// 1) Move some chunks from the shmem buffer into the logging buffer.
// 2) Patch the content of some chunks previously moved.
// 3) Acknowledge a Flush() request.
rpc CommitData(protos.CommitDataRequest) returns (CommitDataResponse) {}
// This is a backchannel to get asynchronous commands / notifications back
// from the Service.
rpc GetAsyncCommand(GetAsyncCommandRequest)
returns (stream GetAsyncCommandResponse) {}
// ----------------------------------------------------
// All methods below have been introduced in Android Q.
// ----------------------------------------------------
// Associates a trace writer with its target buffer.
rpc RegisterTraceWriter(RegisterTraceWriterRequest)
returns (RegisterTraceWriterResponse) {}
// Removes a trace writer association previously added by
// RegisterTraceWriter.
rpc UnregisterTraceWriter(UnregisterTraceWriterRequest)
returns (UnregisterTraceWriterResponse) {}
// Sent by the client in response to a StartDataSource message, when a data
// source is successfully started. This is expected only for data sources that
// set the DataSourceDescriptor.will_notify_on_start flag when registering.
rpc NotifyDataSourceStarted(NotifyDataSourceStartedRequest)
returns (NotifyDataSourceStartedResponse) {}
// Sent by the client in response to a StopDataSource message, when a data
// source is successfully stopped. This is expected only for data sources that
// set the DataSourceDescriptor.will_notify_on_stop flag when registering.
rpc NotifyDataSourceStopped(NotifyDataSourceStoppedRequest)
returns (NotifyDataSourceStoppedResponse) {}
// Sent by the client to request the service to:
// 1) Find all sessions which define these triggers
// 2) Perform an action as defined in those sessions configs.
rpc ActivateTriggers(ActivateTriggersRequest)
returns (ActivateTriggersResponse) {}
// ----------------------------------------------------
// All methods below have been introduced in Android R.
// ----------------------------------------------------
// This is used to linearize the producer with the service and to guarantee
// that all IPCs prior to this call have been seen and processed by the
// service. Example:
// - RegisterDataSource(A)
// - RegisterDataSource(B)
// - Sync()
// When the Sync() response is received, the producer is guaranteed that the
// service has seen both data source registrations.
rpc Sync(SyncRequest) returns (SyncResponse) {}
// ----------------------------------------------------
// All methods below have been introduced in Android T.
// ----------------------------------------------------
// Updates the data source descriptor for an already-registered data source.
// This can be used to update the list of features supported.
// Only the data source with a matching data_source_descriptor.id is updated.
// The data_source_descriptor.name cannot be changed.
rpc UpdateDataSource(UpdateDataSourceRequest)
returns (UpdateDataSourceResponse) {}
}
// Arguments for rpc InitializeConnection().
message InitializeConnectionRequest {
// Optional. Provides a hint to the tracing service about the suggested size
// of the shared memory buffer pages. The service is not required to respect
// this if it has already another value in the configuration or if the hint
// is unreasonably large. Must be an integer multiple of 4096. See tradeoff
// considerations in shared_memory_abi.h.
optional uint32 shared_memory_page_size_hint_bytes = 1;
// Optional. Provides a hint to the tracing service about the suggested size
// of the shared memory buffer. The service is not required to respect this
// and might return a smaller buffer.
optional uint32 shared_memory_size_hint_bytes = 2;
// Required to match the producer config set by the service to the correct
// producer.
optional string producer_name = 3;
enum ProducerSMBScrapingMode {
// Use the service's default setting for SMB scraping.
SMB_SCRAPING_UNSPECIFIED = 0;
// Enable scraping of uncommitted chunks from the producer's shared memory
// buffer.
SMB_SCRAPING_ENABLED = 1;
// Disable scraping of uncommitted chunks from the producer's shared memory
// buffer.
SMB_SCRAPING_DISABLED = 2;
}
// If provided, overrides the service's SMB scraping setting for the producer.
optional ProducerSMBScrapingMode smb_scraping_mode = 4;
// Was build_flags = BUILD_FLAGS_DCHECKS_ON|OFF. It was used to emit an error
// when DCHECKs level didn't match between service and producer (in turn that
// would crash the service when applying patches).
// Removed in v20 as part of b/197340286.
reserved 5;
// ---------------------------------------------------
// All fields below have been introduced in Android R.
// ---------------------------------------------------
// Since Android R, this request can also transport an FD for the producer's
// shared memory buffer, if allocated by the producer (e.g. for startup
// tracing). In this case, |shared_memory_page_size_hint_bytes| is a required
// field, and describes the SMB's page size. Note that the service may not
// accept this SMB (e.g. because it is too old or its size / page size are
// invalid) and instead allocate a new SMB which is provided in the
// SetupTracing response. See TracingService::ConnectProducer() and
// |using_shmem_provided_by_producer| in InitializeConnectionResponse.
optional bool producer_provided_shmem = 6;
// ---------------------------------------------------
// All fields below have been introduced in Android S.
// ---------------------------------------------------
// The version of the client library used by the producer.
// This is a human readable string with and its format varies depending on
// the build system that is used to build the code and the repo (standalone
// vs AOSP). This is intended for human debugging only.
optional string sdk_version = 8;
// On Windows, when producer_provided_shmem = true, the client creates a named
// SHM region and passes the name (an unguessable token) back to the service.
// Introduced in v13.
optional string shm_key_windows = 7;
}
message InitializeConnectionResponse {
// Indicates whether the service accepted the SMB provided by the producer in
// InitializeConnectionRequest (if any). If false, the shared memory buffer FD
// will provided by the service via the SetupTracing async command.
optional bool using_shmem_provided_by_producer = 1;
// Indicates to the producer that the service allows direct SMB patching of
// chunks that have not yet been committed to it.
// This field has been introduced in Android S.
optional bool direct_smb_patching_supported = 2;
}
// Arguments for rpc RegisterDataSource().
message RegisterDataSourceRequest {
optional protos.DataSourceDescriptor data_source_descriptor = 1;
}
message RegisterDataSourceResponse {
// Only set in case of errors, when |data_source_id| == 0.
optional string error = 1;
};
// Arguments for rpc UpdateDataSource().
message UpdateDataSourceRequest {
// The new data_source_descriptor.{id, name} must match {id, name} of a
// data source previously registered via RegisterDataSource().
optional protos.DataSourceDescriptor data_source_descriptor = 1;
}
message UpdateDataSourceResponse {};
// Arguments for rpc UnregisterDataSource().
message UnregisterDataSourceRequest {
// The name of the data source to unregister, as previously passed in
// |RegisterDataSourceRequest.name|.
optional string data_source_name = 1;
}
message UnregisterDataSourceResponse {}
// Arguments for rpc RegisterTraceWriter().
message RegisterTraceWriterRequest {
// The ID of a producer's trace writer.
optional uint32 trace_writer_id = 1;
// The ID of the target buffer that the trace writer commits its chunks to.
optional uint32 target_buffer = 2;
}
message RegisterTraceWriterResponse {}
// Arguments for rpc UnregisterTraceWriter().
message UnregisterTraceWriterRequest {
// The ID of a producer's trace writer.
optional uint32 trace_writer_id = 1;
}
message UnregisterTraceWriterResponse {}
// Arguments for rpc CommitData().
// See commit_data_request.proto for CommitDataRequest. That has its own file
// because it is used also as input to generate C++ classes (xxx.gen.h).
message CommitDataResponse {}
// Arguments for rpc NotifyDataSourceStarted().
message NotifyDataSourceStartedRequest {
// ID of the data source that has successfully started.
optional uint64 data_source_id = 1;
}
message NotifyDataSourceStartedResponse {}
// Arguments for rpc NotifyDataSourceStopped().
message NotifyDataSourceStoppedRequest {
// ID of the data source that has successfully stopped.
optional uint64 data_source_id = 1;
}
message NotifyDataSourceStoppedResponse {}
// Arguments for rpc ActivateTriggersRequest().
message ActivateTriggersRequest {
repeated string trigger_names = 1;
}
message ActivateTriggersResponse {}
// Arguments for rpc GetAsyncCommand().
message GetAsyncCommandRequest {}
message GetAsyncCommandResponse {
// Called after SetupTracing and before StartDataSource.
// This message was introduced in Android Q.
message SetupDataSource {
optional uint64 new_instance_id = 1;
optional protos.DataSourceConfig config = 2;
}
message StartDataSource {
optional uint64 new_instance_id = 1;
// For backwards compat reasons (with Android P), the config passed here
// is identical to the one passed to SetupDataSource.config.
optional protos.DataSourceConfig config = 2;
}
message StopDataSource { optional uint64 instance_id = 1; }
// On Android/Linux/Mac this message also transports the file descriptor for
// the shared memory buffer (not a proto field).
message SetupTracing {
optional uint32 shared_buffer_page_size_kb = 1;
// On Windows, instead, we pass the name (an unguessable token) of a shared
// memory region that can be attached by the other process by name.
// Introduced in v13.
optional string shm_key_windows = 2;
}
message Flush {
// The instance id (i.e. StartDataSource.new_instance_id) of the data
// sources to flush.
repeated uint64 data_source_ids = 1;
// A monotonic counter generated by the service. The producer is simply
// expected to copy this value back into the CommitDataRequest, so the
// service can tell when the data for this flush has been committed.
optional uint64 request_id = 2;
}
// Instructs the given data sources to stop referring to any trace contents
// emitted so far. Sent only to active data sources that set
// |handles_incremental_state_clear| in their DataSourceDescriptor.
//
// Added to perfetto tree in May 2019.
message ClearIncrementalState {
// The instance id (i.e. StartDataSource.new_instance_id) of the data
// sources that should clear their incremental state.
repeated uint64 data_source_ids = 1;
}
// Next id: 8.
oneof cmd {
SetupTracing setup_tracing = 3;
SetupDataSource setup_data_source = 6;
StartDataSource start_data_source = 1;
StopDataSource stop_data_source = 2;
// id == 4 was teardown_tracing, never implemented.
Flush flush = 5;
ClearIncrementalState clear_incremental_state = 7;
}
}
// Arguments for rpc Sync().
message SyncRequest {}
message SyncResponse {}