Skip to content

Commit

Permalink
feat: implement -n X and -a flags (#1341)
Browse files Browse the repository at this point in the history
## Description:
This PR adds the `-a` and `-n` flags to `kurtosis service logs`.

- `-a` flag returns all logs of a service
- `-n X` returns `X` number of log lines

`-a` used with `-n X` will return all the logs. Both flags can be used
in combination with `-f`.

## Is this change user facing?
YES
  • Loading branch information
tedim52 committed Sep 21, 2023
1 parent 269fe88 commit 2c6880c
Show file tree
Hide file tree
Showing 31 changed files with 1,256 additions and 828 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

271 changes: 147 additions & 124 deletions api/golang/engine/kurtosis_engine_rpc_api_bindings/engine_service.pb.go

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 7 additions & 1 deletion api/golang/engine/lib/kurtosis_context/kurtosis_context.go
Expand Up @@ -276,6 +276,8 @@ func (kurtosisCtx *KurtosisContext) GetServiceLogs(
enclaveIdentifier string,
userServiceUuids map[services.ServiceUUID]bool,
shouldFollowLogs bool,
shouldReturnAllLogs bool,
numLogLines uint32,
logLineFilter *LogLineFilter,
) (
chan *serviceLogsStreamContent,
Expand All @@ -295,7 +297,7 @@ func (kurtosisCtx *KurtosisContext) GetServiceLogs(
//this process could take much time until the next channel pull, so we could be filling the buffer during that time to not let the servers thread idled
serviceLogsStreamContentChan := make(chan *serviceLogsStreamContent, serviceLogsStreamContentChanBufferSize)

getServiceLogsArgs, err := newGetServiceLogsArgs(enclaveIdentifier, userServiceUuids, shouldFollowLogs, logLineFilter)
getServiceLogsArgs, err := newGetServiceLogsArgs(enclaveIdentifier, userServiceUuids, shouldFollowLogs, shouldReturnAllLogs, numLogLines, logLineFilter)
if err != nil {
return nil, nil, stacktrace.Propagate(
err,
Expand Down Expand Up @@ -498,6 +500,8 @@ func newGetServiceLogsArgs(
enclaveIdentifier string,
userServiceUUIDs map[services.ServiceUUID]bool,
shouldFollowLogs bool,
shouldReturnAllLogs bool,
numLogLines uint32,
logLineFilter *LogLineFilter,
) (*kurtosis_engine_rpc_api_bindings.GetServiceLogsArgs, error) {
userServiceUuuidSet := make(map[string]bool, len(userServiceUUIDs))
Expand All @@ -517,6 +521,8 @@ func newGetServiceLogsArgs(
ServiceUuidSet: userServiceUuuidSet,
FollowLogs: shouldFollowLogs,
ConjunctiveFilters: grpcConjunctiveFilters,
ReturnAllLogs: shouldReturnAllLogs,
NumLogLines: numLogLines,
}

return getUserServiceLogsArgs, nil
Expand Down
4 changes: 4 additions & 0 deletions api/protobuf/engine/engine_service.proto
Expand Up @@ -211,6 +211,10 @@ message GetServiceLogsArgs {
bool follow_logs = 3;
// The conjunctive log lines filters, the first filter is applied over the found log lines, the second filter is applied over the filter one result and so on (like grep)
repeated LogLineFilter conjunctive_filters = 4;
// If true, return all log lines
bool return_all_logs = 5;
// If [return_all_logs] is false, return [num_log_lines]
uint32 num_log_lines = 6;
}

message GetServiceLogsResponse {
Expand Down
6 changes: 6 additions & 0 deletions api/rust/src/engine_api.rs
Expand Up @@ -188,6 +188,12 @@ pub struct GetServiceLogsArgs {
/// The conjunctive log lines filters, the first filter is applied over the found log lines, the second filter is applied over the filter one result and so on (like grep)
#[prost(message, repeated, tag = "4")]
pub conjunctive_filters: ::prost::alloc::vec::Vec<LogLineFilter>,
/// If true, return all log lines
#[prost(bool, tag = "5")]
pub return_all_logs: bool,
/// If \[return_all_logs\] is false, return \[num_log_lines\]
#[prost(uint32, tag = "6")]
pub num_log_lines: u32,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
Expand Down
Expand Up @@ -650,6 +650,20 @@ export declare class GetServiceLogsArgs extends Message<GetServiceLogsArgs> {
*/
conjunctiveFilters: LogLineFilter[];

/**
* If true, return all log lines
*
* @generated from field: bool return_all_logs = 5;
*/
returnAllLogs: boolean;

/**
* If [return_all_logs] is false, return [num_log_lines]
*
* @generated from field: uint32 num_log_lines = 6;
*/
numLogLines: number;

constructor(data?: PartialMessage<GetServiceLogsArgs>);

static readonly runtime: typeof proto3;
Expand Down
Expand Up @@ -261,6 +261,8 @@ export const GetServiceLogsArgs = proto3.makeMessageType(
{ no: 2, name: "service_uuid_set", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "scalar", T: 8 /* ScalarType.BOOL */} },
{ no: 3, name: "follow_logs", kind: "scalar", T: 8 /* ScalarType.BOOL */ },
{ no: 4, name: "conjunctive_filters", kind: "message", T: LogLineFilter, repeated: true },
{ no: 5, name: "return_all_logs", kind: "scalar", T: 8 /* ScalarType.BOOL */ },
{ no: 6, name: "num_log_lines", kind: "scalar", T: 13 /* ScalarType.UINT32 */ },
],
);

Expand Down
Expand Up @@ -351,6 +351,12 @@ export class GetServiceLogsArgs extends jspb.Message {
clearConjunctiveFiltersList(): GetServiceLogsArgs;
addConjunctiveFilters(value?: LogLineFilter, index?: number): LogLineFilter;

getReturnAllLogs(): boolean;
setReturnAllLogs(value: boolean): GetServiceLogsArgs;

getNumLogLines(): number;
setNumLogLines(value: number): GetServiceLogsArgs;

serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetServiceLogsArgs.AsObject;
static toObject(includeInstance: boolean, msg: GetServiceLogsArgs): GetServiceLogsArgs.AsObject;
Expand All @@ -365,6 +371,8 @@ export namespace GetServiceLogsArgs {
serviceUuidSetMap: Array<[string, boolean]>,
followLogs: boolean,
conjunctiveFiltersList: Array<LogLineFilter.AsObject>,
returnAllLogs: boolean,
numLogLines: number,
}
}

Expand Down
Expand Up @@ -2945,7 +2945,9 @@ proto.engine_api.GetServiceLogsArgs.toObject = function(includeInstance, msg) {
serviceUuidSetMap: (f = msg.getServiceUuidSetMap()) ? f.toObject(includeInstance, undefined) : [],
followLogs: jspb.Message.getBooleanFieldWithDefault(msg, 3, false),
conjunctiveFiltersList: jspb.Message.toObjectList(msg.getConjunctiveFiltersList(),
proto.engine_api.LogLineFilter.toObject, includeInstance)
proto.engine_api.LogLineFilter.toObject, includeInstance),
returnAllLogs: jspb.Message.getBooleanFieldWithDefault(msg, 5, false),
numLogLines: jspb.Message.getFieldWithDefault(msg, 6, 0)
};

if (includeInstance) {
Expand Down Expand Up @@ -3001,6 +3003,14 @@ proto.engine_api.GetServiceLogsArgs.deserializeBinaryFromReader = function(msg,
reader.readMessage(value,proto.engine_api.LogLineFilter.deserializeBinaryFromReader);
msg.addConjunctiveFilters(value);
break;
case 5:
var value = /** @type {boolean} */ (reader.readBool());
msg.setReturnAllLogs(value);
break;
case 6:
var value = /** @type {number} */ (reader.readUint32());
msg.setNumLogLines(value);
break;
default:
reader.skipField();
break;
Expand Down Expand Up @@ -3056,6 +3066,20 @@ proto.engine_api.GetServiceLogsArgs.serializeBinaryToWriter = function(message,
proto.engine_api.LogLineFilter.serializeBinaryToWriter
);
}
f = message.getReturnAllLogs();
if (f) {
writer.writeBool(
5,
f
);
}
f = message.getNumLogLines();
if (f !== 0) {
writer.writeUint32(
6,
f
);
}
};


Expand Down Expand Up @@ -3155,6 +3179,42 @@ proto.engine_api.GetServiceLogsArgs.prototype.clearConjunctiveFiltersList = func
};


/**
* optional bool return_all_logs = 5;
* @return {boolean}
*/
proto.engine_api.GetServiceLogsArgs.prototype.getReturnAllLogs = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false));
};


/**
* @param {boolean} value
* @return {!proto.engine_api.GetServiceLogsArgs} returns this
*/
proto.engine_api.GetServiceLogsArgs.prototype.setReturnAllLogs = function(value) {
return jspb.Message.setProto3BooleanField(this, 5, value);
};


/**
* optional uint32 num_log_lines = 6;
* @return {number}
*/
proto.engine_api.GetServiceLogsArgs.prototype.getNumLogLines = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0));
};


/**
* @param {number} value
* @return {!proto.engine_api.GetServiceLogsArgs} returns this
*/
proto.engine_api.GetServiceLogsArgs.prototype.setNumLogLines = function(value) {
return jspb.Message.setProto3IntField(this, 6, value);
};





Expand Down
4 changes: 4 additions & 0 deletions api/typescript/src/engine/lib/constructor_calls.ts
Expand Up @@ -49,6 +49,8 @@ export function newGetServiceLogsArgs(
enclaveIdentifier: string,
serviceUuids: Set<ServiceUUID>,
shouldFollowLogs: boolean,
shouldReturnAllLogs: boolean,
numLogLines: number,
logLineFilter: kurtosisCtx.LogLineFilter|undefined,
): GetServiceLogsArgs {

Expand All @@ -69,6 +71,8 @@ export function newGetServiceLogsArgs(
}

result.setConjunctiveFiltersList(grpcConjunctiveFilters)
result.setReturnAllLogs(shouldReturnAllLogs)
result.setNumLogLines(numLogLines)
return result;
}

Expand Down
Expand Up @@ -237,11 +237,17 @@ export class KurtosisContext {
//})
//You can cancel receiving the stream from the service calling serviceLogsReadable.destroy()
// Docs available at https://docs.kurtosis.com/sdk#getservicelogsstring-enclaveidentifier-setserviceuuid-serviceuuids-boolean-shouldfollowlogs-loglinefilter-loglinefilter---servicelogsstreamcontent-servicelogsstreamcontent
public async getServiceLogs(enclaveIdentifier: string, serviceUuids: Set<ServiceUUID>, shouldFollowLogs: boolean, logLineFilter: LogLineFilter|undefined): Promise<Result<Readable, Error>> {
public async getServiceLogs(
enclaveIdentifier: string,
serviceUuids: Set<ServiceUUID>,
shouldFollowLogs: boolean,
shouldReturnAllLogs : boolean,
numLogLines : number,
logLineFilter: LogLineFilter|undefined): Promise<Result<Readable, Error>> {
let getServiceLogsArgs: GetServiceLogsArgs;

try {
getServiceLogsArgs = newGetServiceLogsArgs(enclaveIdentifier, serviceUuids, shouldFollowLogs, logLineFilter);
getServiceLogsArgs = newGetServiceLogsArgs(enclaveIdentifier, serviceUuids, shouldFollowLogs, shouldReturnAllLogs, numLogLines, logLineFilter);
} catch(error) {
return err(new Error(`An error occurred getting the get service logs arguments for enclave identifier '${enclaveIdentifier}', service UUIDs '${serviceUuids}', with should follow value '${shouldFollowLogs}' and log line filter '${logLineFilter}'. Error:\n${error}`));
}
Expand Down
32 changes: 31 additions & 1 deletion cli/cli/commands/service/logs/logs.go
Expand Up @@ -38,6 +38,8 @@ const (
isServiceIdentifierArgGreedy = false

shouldFollowLogsFlagKey = "follow"
returnNumLogsFlagKey = "num"
returnAllLogsFlagKey = "all"
matchTextFilterFlagKey = "match"
matchRegexFilterFlagKey = "regex-match"
invertMatchFilterFlagKey = "invert-match"
Expand All @@ -49,6 +51,7 @@ const (

interruptChanBufferSize = 5

defaultNumLogLines = 200
commonInstructionInMatchFlags = "Important: " + matchTextFilterFlagKey + " and " + matchRegexFilterFlagKey + " flags cannot be used at the same time. You should either use one or the other."
)

Expand All @@ -57,6 +60,9 @@ var doNotFilterLogLines *kurtosis_context.LogLineFilter = nil
var defaultShouldFollowLogs = strconv.FormatBool(false)
var defaultInvertMatchFilterFlagValue = strconv.FormatBool(false)

var defaultShouldReturnAllLogs = strconv.FormatBool(false)
var defaultNumLogLinesFlagValue = strconv.Itoa(defaultNumLogLines)

var ServiceLogsCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCommand{
CommandStr: command_str_consts.ServiceLogsCmdStr,
ShortDescription: "Get service logs",
Expand All @@ -71,6 +77,20 @@ var ServiceLogsCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisC
Type: flags.FlagType_Bool,
Default: defaultShouldFollowLogs,
},
{
Key: returnAllLogsFlagKey,
Usage: "Gets all logs.",
Shorthand: "a",
Type: flags.FlagType_Bool,
Default: defaultShouldReturnAllLogs,
},
{
Key: returnNumLogsFlagKey,
Usage: "Get the last X log lines.",
Shorthand: "n",
Type: flags.FlagType_Uint32,
Default: defaultNumLogLinesFlagValue,
},
{
Key: matchTextFilterFlagKey,
Usage: fmt.Sprintf(
Expand Down Expand Up @@ -141,6 +161,16 @@ func run(
return stacktrace.Propagate(err, "An error occurred getting the should-follow-logs flag using key '%v'", shouldFollowLogsFlagKey)
}

shouldReturnAllLogs, err := flags.GetBool(returnAllLogsFlagKey)
if err != nil {
return stacktrace.Propagate(err, "An error occurred getting the 'all' flag using key '%v'", returnAllLogsFlagKey)
}

numLogLines, err := flags.GetUint32(returnNumLogsFlagKey)
if err != nil {
return stacktrace.Propagate(err, "An error occurred getting the 'num' flag using key '%v'", returnNumLogsFlagKey)
}

matchTextStr, err := flags.GetString(matchTextFilterFlagKey)
if err != nil {
return stacktrace.Propagate(err, "An error occurred getting the match flag using key '%v'", matchTextFilterFlagKey)
Expand Down Expand Up @@ -172,7 +202,7 @@ func run(
return stacktrace.Propagate(err, "An error occurred getting the log line filter using these filter flag values '%s=%s', '%s=%s', '%s=%v'", matchTextFilterFlagKey, matchTextStr, matchRegexFilterFlagKey, matchRegexStr, invertMatchFilterFlagKey, invertMatch)
}

serviceLogsStreamContentChan, cancelStreamUserServiceLogsFunc, err := kurtosisCtx.GetServiceLogs(ctx, enclaveIdentifier, userServiceUuids, shouldFollowLogs, logLineFilter)
serviceLogsStreamContentChan, cancelStreamUserServiceLogsFunc, err := kurtosisCtx.GetServiceLogs(ctx, enclaveIdentifier, userServiceUuids, shouldFollowLogs, shouldReturnAllLogs, numLogLines, logLineFilter)
if err != nil {
return stacktrace.Propagate(err, "An error occurred getting user service logs from user services with UUIDs '%+v' in enclave '%v' and with follow logs value '%v'", userServiceUuids, enclaveIdentifier, shouldFollowLogs)
}
Expand Down

0 comments on commit 2c6880c

Please sign in to comment.