blob: 78fcb37a97d9a1846e559717c615a3ce8f3451b3 [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed 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 telemetry
import (
"strconv"
"strings"
)
import (
"github.com/apache/dubbo-go-pixiu/pilot/pkg/model"
"github.com/apache/dubbo-go-pixiu/pilot/pkg/networking/util"
"github.com/apache/dubbo-go-pixiu/pilot/pkg/serviceregistry/provider"
"github.com/apache/dubbo-go-pixiu/pkg/config/host"
)
var (
// StatName patterns
serviceStatPattern = "%SERVICE%"
serviceFQDNStatPattern = "%SERVICE_FQDN%"
servicePortStatPattern = "%SERVICE_PORT%"
servicePortNameStatPattern = "%SERVICE_PORT_NAME%"
subsetNameStatPattern = "%SUBSET_NAME%"
)
// BuildStatPrefix builds a stat prefix based on the stat pattern.
func BuildStatPrefix(statPattern string, host string, subset string, port *model.Port, attributes *model.ServiceAttributes) string {
prefix := strings.ReplaceAll(statPattern, serviceStatPattern, shortHostName(host, attributes))
prefix = strings.ReplaceAll(prefix, serviceFQDNStatPattern, host)
prefix = strings.ReplaceAll(prefix, subsetNameStatPattern, subset)
prefix = strings.ReplaceAll(prefix, servicePortStatPattern, strconv.Itoa(port.Port))
prefix = strings.ReplaceAll(prefix, servicePortNameStatPattern, port.Name)
return prefix
}
// BuildInboundStatPrefix builds a stat prefix based on the stat pattern and filter chain telemetry data.
func BuildInboundStatPrefix(statPattern string, tm FilterChainMetadata, subset string, port uint32, portName string) string {
prefix := strings.ReplaceAll(statPattern, serviceStatPattern, tm.ShortHostname())
prefix = strings.ReplaceAll(prefix, serviceFQDNStatPattern, tm.InstanceHostname.String())
prefix = strings.ReplaceAll(prefix, subsetNameStatPattern, subset)
prefix = strings.ReplaceAll(prefix, servicePortStatPattern, strconv.Itoa(int(port)))
prefix = strings.ReplaceAll(prefix, servicePortNameStatPattern, portName)
return prefix
}
// shortHostName constructs the name from kubernetes hosts based on attributes (name and namespace).
// For other hosts like VMs, this method does not do any thing - just returns the passed in host as is.
func shortHostName(host string, attributes *model.ServiceAttributes) string {
if attributes.ServiceRegistry == provider.Kubernetes {
return attributes.Name + "." + attributes.Namespace
}
return host
}
// TraceOperation builds the string format: "%s:%d/*" for a given host and port
func TraceOperation(host string, port int) string {
// Format : "%s:%d/*"
return util.DomainName(host, port) + "/*"
}
// FilterChainMetadata defines additional metadata for telemetry use for a filter chain.
type FilterChainMetadata struct {
// InstanceHostname defines the hostname of the service this filter chain is built for.
// Note: This is best effort; this may be empty if generated by Sidecar config, and there may be multiple
// Services that make up the filter chain.
InstanceHostname host.Name
// KubernetesServiceNamespace is the namespace the service is defined in, if it is for a Kubernetes Service.
// Note: This is best effort; this may be empty if generated by Sidecar config, and there may be multiple
// Services that make up the filter chain.
KubernetesServiceNamespace string
// KubernetesServiceName is the name of service, if it is for a Kubernetes Service.
// Note: This is best effort; this may be empty if generated by Sidecar config, and there may be multiple
// Services that make up the filter chain.
KubernetesServiceName string
}
// ShortHostname constructs the name from kubernetes service name if available or just uses instance host name.
func (tm FilterChainMetadata) ShortHostname() string {
if tm.KubernetesServiceName != "" {
return tm.KubernetesServiceName + "." + tm.KubernetesServiceNamespace
}
return tm.InstanceHostname.String()
}