internal/flags/duration.go (55 lines of code) (raw):

// Licensed to Apache Software Foundation (ASF) under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Apache Software Foundation (ASF) licenses this file to you 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. package flags import ( "github.com/urfave/cli/v2" api "skywalking.apache.org/repo/goapi/query" "github.com/apache/skywalking-cli/internal/model" ) var startEndUsage = `"start" and "end" specify a time range during which the query is preformed, they can be absolute time like "2019-01-01 12", "2019-01-01 1213", or relative time (to the current time) like "-30m", "30m". They are both optional and their default values follow the rules below: 1. when "start" and "end" are both absent, "start = now - 30 minutes" and "end = now", namely past 30 minutes; 2. when "start" and "end" are both present, they are aligned to the same precision by truncating the more precise one, e.g. if "start = 2019-01-01 1234, end = 2019-01-01 18", then "start" is truncated (because it's more precise) to "2019-01-01 12", and "end = 2019-01-01 18"; 3. when "start" is absent and "end" is present, will determine the precision of "end" and then use the precision to calculate "start" (minus 30 units), e.g. "end = 2019-11-09 1234", the precision is "MINUTE", so "start = end - 30 minutes = 2019-11-09 1204", and if "end = 2019-11-09 12", the precision is "HOUR", so "start = end - 30HOUR = 2019-11-08 06"; 4. when "start" is present and "end" is absent, will determine the precision of "start" and then use the precision to calculate "end" (plus 30 units), e.g. "start = 2019-11-09 1204", the precision is "MINUTE", so "end = start + 30 minutes = 2019-11-09 1234", and if "start = 2019-11-08 06", the precision is "HOUR", so "end = start + 30HOUR = 2019-11-09 12". Examples: 1. Query the metrics from 20 minutes ago to 10 minutes ago $ swctl metrics linear --name=service_resp_time --service-name business-zone::projectB --start "-20m" --end "-10m" 2. Query the metrics from 1 hour ago to 10 minutes ago $ swctl metrics linear --name=service_resp_time --service-name business-zone::projectB --start "-1h" --end "-10m" 3. Query the metrics from 1 hour ago to now $ swctl metrics linear --name=service_resp_time --service-name business-zone::projectB --start "-1h" --end "0m" 4. Query the metrics from "2021-10-26 1047" to "2021-10-26 1127" $ swctl metrics linear --name=service_resp_time --service-name business-zone::projectB --start "2021-10-26 1047" --end "2021-10-26 1127"` // DurationFlags are healthcheck flags that involves a duration, composed // by a start time, an end time, and a step, which is commonly used // in most of the commands var DurationFlags = []cli.Flag{ &cli.StringFlag{ Name: "start", Usage: startEndUsage, }, &cli.StringFlag{ Name: "end", Usage: `end time of the query duration. Check the usage of "start"`, }, &cli.GenericFlag{ Name: "step", Usage: `time step between start time and end time, should be one of SECOND, MINUTE, HOUR, DAY`, Value: &model.StepEnumValue{ Enum: api.AllStep, Default: api.StepMinute, Selected: api.StepMinute, }, }, &cli.StringFlag{ Name: "duration-type", Usage: "the type of duration", Hidden: true, }, }