// copied from https://github.com/kubernetes/kubernetes/blob/11ade2f7dd264c2f52a4a1342458abbbaa3cb2b1/staging/src/k8s.io/apiserver/pkg/endpoints/request/requestinfo.go#L44
// KubernetesRequestInfo contains Kubernetes specific information in the request (if the type is `kubernetes-api-request`)
typeKubernetesRequestInfostruct{
// IsResourceRequest indicates whether or not the request is for an API resource or subresource
IsResourceRequestbool
// Path is the URL path of the request
Pathstring
// Verb is the kube verb associated with the request for API requests, not the http verb. This includes things like list and watch.
// for non-resource requests, this is the lowercase http verb
Verbstring
APIPrefixstring
APIGroupstring
APIVersionstring
Namespacestring
// Resource is the name of the resource being requested. This is not the kind. For example: pods
Resourcestring
// Subresource is the name of the subresource being requested. This is a different resource, scoped to the parent resource, but it may have a different kind.
// For instance, /pods has the resource "pods" and the kind "Pod", while /pods/foo/status has the resource "pods", the sub resource "status", and the kind "Pod"
// (because status operates on pods). The binding resource for a pod though may be /pods/foo/binding, which has resource "pods", subresource "binding", and kind "Binding".
Subresourcestring
// Name is empty for some verbs, but if the request directly indicates a name (not in body content) then this field is filled in.
Namestring
// Parts are the path parts for the request, always starting with /{resource}/{name}
Parts[]string
// FieldSelector contains the unparsed field selector from a request. It is only present if the apiserver
// honors field selectors for the verb this request is associated with.
FieldSelectorstring
// LabelSelector contains the unparsed field selector from a request. It is only present if the apiserver
// honors field selectors for the verb this request is associated with.
LabelSelectorstring
}
typeSourcestruct{
// Node is the FQDN of the node originating the connection.
// It is also the MagicDNS name for the node.
// It does not have a trailing dot.
// e.g. "host.tail-scale.ts.net"
Nodestring`json:"node"`
// NodeID is the node ID of the node originating the connection.
NodeIDtailcfg.StableNodeID`json:"nodeID"`
// Tailscale-specific fields:
// NodeTags is the list of tags on the node originating the connection (if any).
NodeTags[]string`json:"nodeTags,omitempty"`
// NodeUserID is the user ID of the node originating the connection (if not tagged).
NodeUserIDtailcfg.UserID`json:"nodeUserID,omitempty"`// if not tagged
// NodeUser is the LoginName of the node originating the connection (if not tagged).