| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| library fuchsia.developer.ffx; |
| using fuchsia.device; |
| using fuchsia.developer.remotecontrol as rc; |
| |
| type StreamMode = strict enum : uint32 { |
| SNAPSHOT_ALL = 1; |
| SNAPSHOT_RECENT_THEN_SUBSCRIBE = 2; |
| SNAPSHOT_ALL_THEN_SUBSCRIBE = 3; |
| SUBSCRIBE = 4; |
| }; |
| |
| type DiagnosticsStreamError = strict enum : uint32 { |
| // Indicates an error that doesn't fall into any of the below types. |
| GENERIC_ERROR = 1; |
| // Indicates a required parameter is missing |
| MISSING_PARAMETER = 2; |
| // Indicates the provided target specifier does not match any targets |
| // or matches more than target. |
| TARGET_MATCH_FAILED = 3; |
| // Indicates the provided target specifier does not match any targets. |
| // This is a more specific version of TARGET_MATCH_FAILED that is |
| // used when possible. |
| NO_MATCHING_TARGETS = 4; |
| // Indicates that we have not successfully setup a logging stream |
| // for the specified target. |
| NO_STREAM_FOR_TARGET = 5; |
| // Indicates there are no log streams for the provided target specifier, |
| // either in the target cache or on disk. |
| NO_MATCHING_OFFLINE_TARGETS = 6; |
| // Indicates there are no log streams for the provided target specifier, |
| // either in the target cache or on disk. |
| NO_MATCHING_OFFLINE_SESSIONS = 7; |
| }; |
| |
| // Represents a time-bound in nanoseconds, which may be either a host timestamp or monotonic time. |
| type TimeBound = flexible union { |
| 1: absolute uint64; |
| 2: monotonic uint64; |
| }; |
| |
| type DaemonDiagnosticsStreamParameters = table { |
| 1: stream_mode StreamMode; |
| // Sets the earliest time (in monotonic nanoseconds) of logs that will be returned. |
| 2: min_target_timestamp_nanos uint64; |
| // The session the client intends to stream. |
| 3: session SessionSpec; |
| // Sets the earliest time (in nanoseconds) of logs that will be returned. |
| 4: min_timestamp_nanos TimeBound; |
| }; |
| |
| // Specifies a particular log session |
| type SessionSpec = flexible union { |
| // An absolute timestamp identifying the session. |
| 1: timestamp_nanos uint64; |
| // A number specifying a session relative to the most-recent one, where |
| // "0" means the most-recent session, "1" would be the second-most-recent, etc. |
| 2: relative uint32; |
| }; |
| |
| // Metadata about a particular log session |
| type LogSession = table { |
| // Identifier for the logging target (nodename, in the case of a Fuchsia device). |
| 1: target_identifier string:fuchsia.device.DEVICE_NAME_MAX; |
| // Timestamp identifier for the logging session. For Fuchsia targets, this is the |
| // boot timestamp of the target. |
| 2: session_timestamp_nanos uint64; |
| }; |
| |
| @discoverable |
| protocol Diagnostics { |
| /// Creates an iterator over diagnostics data. At present, this means cached log data. |
| /// |
| /// Note that there is some duplication in this API and the StreamDiagnostics API in RCS. |
| /// This is because the surface for the service API needs to be slightly different: |
| /// 1) It needs to accommodate specifying a target. |
| /// 2) The error surface is accordingly slightly different. |
| /// 3) The parameters surface is currently different (SNAPSHOT_RECENT_THEN_SUBSCRIBE has no |
| /// meaning in the diagnostics bridge) and have different evolution paths - for example, this |
| /// service may eventually support multi-target log streaming. |
| /// |
| /// If the target field is a nodename or log session identifier (e.g. "ffx_daemon"), |
| /// then cached logs will be returned for that target even if the target is |
| /// currently offline. |
| /// |
| /// One must keep the channel open to this protocol in order for the |
| /// ArchiveIterator to function properly. |
| StreamDiagnostics(resource struct { |
| target string:<fuchsia.device.DEVICE_NAME_MAX, optional>; |
| parameters DaemonDiagnosticsStreamParameters; |
| iterator server_end:rc.ArchiveIterator; |
| }) -> (struct { |
| session LogSession; |
| }) error DiagnosticsStreamError; |
| }; |