mirror of
https://github.com/kubeshark/kubeshark.git
synced 2025-05-04 06:38:24 +00:00
* Add gin-contrib/pprof dependency * Run pprof server on agent with --profiler flag * Add --profiler flag to cli * Fix error message * Print cpu usage percentage * measure cpu of current pid instead of globaly on the system * Add scripts to plot performance * Plot packetsCount in analysis * Concat to DataFrame * Plot in turbo colorscheme * Make COLORMAP const * Fix rss units * Reduce code repetition by adding function for plotting * Allow grouping based on filenames * Temporary: Marked with comments where to disable code for experiments * Add newline at end of file * Add tap.cpuprofile flag. Change memprofile flag to tap.memprofile * create tapper modes for debugging using env vars * Fix rss plot units (MB instead of bytes) * Remove comment * Add info to plot script * Remove tap.cpumemprofile. Rename tap.memprofile to memprofile * Remove unused import * Remove whitespaces Co-authored-by: M. Mert Yıldıran <mehmet@up9.com> * Remove whitespaces Co-authored-by: M. Mert Yıldıran <mehmet@up9.com> * Remove whitespaces Co-authored-by: M. Mert Yıldıran <mehmet@up9.com> * Remove whitespaces Co-authored-by: M. Mert Yıldıran <mehmet@up9.com> * Remove whitespaces Co-authored-by: M. Mert Yıldıran <mehmet@up9.com> * Remove whitespaces Co-authored-by: M. Mert Yıldıran <mehmet@up9.com> * Rename debug env vars * Create package for debug env vars, read each env var once * Run go mod tidy * Increment MatchedPairs before emitting * Only count cores once * Count virtual and physical cores * Add dbgctl replace in cli * Fix lint: Check return values * Add tap/dbgctl to test-lint make rule * Replace tap/dbgctl in all modules * #run_acceptance_tests * Copy dbgctl module to docker image * Debug/profile tapper benchmark (#1093) * add mizu debug env to avoid all extensions * add readme + run_tapper_benchmark.sh * temporary change branch name * fix readme * fix MIZU_BENCHMARK_CLIENTS_COUNT env * change tap target to tcp stream * track live tcp streams * pr fixes * rename tapperPacketsCount to ignored_packets_count * change mizu tapper to mizu debugg Co-authored-by: David Levanon <dvdlevanon@gmail.com> Co-authored-by: M. Mert Yıldıran <mehmet@up9.com>
128 lines
5.3 KiB
Go
128 lines
5.3 KiB
Go
package cmd
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/up9inc/mizu/cli/up9"
|
|
|
|
"github.com/creasty/defaults"
|
|
"github.com/spf13/cobra"
|
|
"github.com/up9inc/mizu/cli/auth"
|
|
"github.com/up9inc/mizu/cli/config"
|
|
"github.com/up9inc/mizu/cli/config/configStructs"
|
|
"github.com/up9inc/mizu/cli/errormessage"
|
|
"github.com/up9inc/mizu/cli/uiUtils"
|
|
"github.com/up9inc/mizu/logger"
|
|
"github.com/up9inc/mizu/shared"
|
|
)
|
|
|
|
const uploadTrafficMessageToConfirm = `NOTE: running mizu with --%s flag will upload recorded traffic for further analysis and enriched presentation options.`
|
|
|
|
var tapCmd = &cobra.Command{
|
|
Use: "tap [POD REGEX]",
|
|
Short: "Record ingoing traffic of a kubernetes pod",
|
|
Long: `Record the ingoing traffic of a kubernetes pod.
|
|
Supported protocols are HTTP and gRPC.`,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
RunMizuTap()
|
|
return nil
|
|
},
|
|
PreRunE: func(cmd *cobra.Command, args []string) error {
|
|
if len(args) == 1 {
|
|
config.Config.Tap.PodRegexStr = args[0]
|
|
} else if len(args) > 1 {
|
|
return errors.New("unexpected number of arguments")
|
|
}
|
|
|
|
if err := config.Config.Tap.Validate(); err != nil {
|
|
return errormessage.FormatError(err)
|
|
}
|
|
|
|
if config.Config.Tap.Workspace != "" {
|
|
askConfirmation(configStructs.WorkspaceTapName)
|
|
|
|
if config.Config.Auth.Token == "" {
|
|
logger.Log.Infof("This action requires authentication, please log in to continue")
|
|
if err := auth.Login(); err != nil {
|
|
logger.Log.Errorf("failed to log in, err: %v", err)
|
|
return nil
|
|
}
|
|
} else {
|
|
tokenExpired, err := shared.IsTokenExpired(config.Config.Auth.Token)
|
|
if err != nil {
|
|
logger.Log.Errorf("failed to check if token is expired, err: %v", err)
|
|
return nil
|
|
}
|
|
|
|
if tokenExpired {
|
|
logger.Log.Infof("Token expired, please log in again to continue")
|
|
if err := auth.Login(); err != nil {
|
|
logger.Log.Errorf("failed to log in, err: %v", err)
|
|
return nil
|
|
}
|
|
} else if isValidToken := up9.IsTokenValid(config.Config.Auth.Token, config.Config.Auth.EnvName); !isValidToken {
|
|
logger.Log.Errorf("Token is not valid, please log in again to continue")
|
|
if err := auth.Login(); err != nil {
|
|
logger.Log.Errorf("failed to log in, err: %v", err)
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if config.Config.Tap.Analysis {
|
|
askConfirmation(configStructs.AnalysisTapName)
|
|
|
|
config.Config.Auth.Token = ""
|
|
}
|
|
|
|
logger.Log.Infof("Mizu will store up to %s of traffic, old traffic will be cleared once the limit is reached.", config.Config.Tap.HumanMaxEntriesDBSize)
|
|
|
|
return nil
|
|
},
|
|
}
|
|
|
|
func askConfirmation(flagName string) {
|
|
logger.Log.Infof(fmt.Sprintf(uploadTrafficMessageToConfirm, flagName))
|
|
|
|
if !config.Config.Tap.AskUploadConfirmation {
|
|
return
|
|
}
|
|
|
|
if !uiUtils.AskForConfirmation("Would you like to proceed [Y/n]: ") {
|
|
logger.Log.Infof("You can always run mizu without %s, aborting", flagName)
|
|
os.Exit(0)
|
|
}
|
|
|
|
if err := config.UpdateConfig(func(configStruct *config.ConfigStruct) { configStruct.Tap.AskUploadConfirmation = false }); err != nil {
|
|
logger.Log.Debugf("failed updating config with upload confirmation, err: %v", err)
|
|
}
|
|
}
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(tapCmd)
|
|
|
|
defaultTapConfig := configStructs.TapConfig{}
|
|
if err := defaults.Set(&defaultTapConfig); err != nil {
|
|
logger.Log.Debug(err)
|
|
}
|
|
|
|
tapCmd.Flags().Uint16P(configStructs.GuiPortTapName, "p", defaultTapConfig.GuiPort, "Provide a custom port for the web interface webserver")
|
|
tapCmd.Flags().StringSliceP(configStructs.NamespacesTapName, "n", defaultTapConfig.Namespaces, "Namespaces selector")
|
|
tapCmd.Flags().Bool(configStructs.AnalysisTapName, defaultTapConfig.Analysis, "Uploads traffic to UP9 for further analysis (Beta)")
|
|
tapCmd.Flags().BoolP(configStructs.AllNamespacesTapName, "A", defaultTapConfig.AllNamespaces, "Tap all namespaces")
|
|
tapCmd.Flags().StringSliceP(configStructs.PlainTextFilterRegexesTapName, "r", defaultTapConfig.PlainTextFilterRegexes, "List of regex expressions that are used to filter matching values from text/plain http bodies")
|
|
tapCmd.Flags().Bool(configStructs.DisableRedactionTapName, defaultTapConfig.DisableRedaction, "Disables redaction of potentially sensitive request/response headers and body values")
|
|
tapCmd.Flags().String(configStructs.HumanMaxEntriesDBSizeTapName, defaultTapConfig.HumanMaxEntriesDBSize, "Override the default max entries db size")
|
|
tapCmd.Flags().String(configStructs.InsertionFilterName, defaultTapConfig.InsertionFilter, "Set the insertion filter. Accepts string or a file path.")
|
|
tapCmd.Flags().Bool(configStructs.DryRunTapName, defaultTapConfig.DryRun, "Preview of all pods matching the regex, without tapping them")
|
|
tapCmd.Flags().StringP(configStructs.WorkspaceTapName, "w", defaultTapConfig.Workspace, "Uploads traffic to your UP9 workspace for further analysis (requires auth)")
|
|
tapCmd.Flags().String(configStructs.EnforcePolicyFile, defaultTapConfig.EnforcePolicyFile, "Yaml file path with policy rules")
|
|
tapCmd.Flags().String(configStructs.ContractFile, defaultTapConfig.ContractFile, "OAS/Swagger file to validate to monitor the contracts")
|
|
tapCmd.Flags().Bool(configStructs.ServiceMeshName, defaultTapConfig.ServiceMesh, "Record decrypted traffic if the cluster is configured with a service mesh and with mtls")
|
|
tapCmd.Flags().Bool(configStructs.TlsName, defaultTapConfig.Tls, "Record tls traffic")
|
|
tapCmd.Flags().Bool(configStructs.ProfilerName, defaultTapConfig.Profiler, "Run pprof server")
|
|
}
|