Bumps the go-deps group with 12 updates in the / directory: | Package | From | To | | --- | --- | --- | | [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) | `1.41.0` | `1.42.0` | | [github.com/Azure/azure-sdk-for-go/sdk/azidentity](https://github.com/Azure/azure-sdk-for-go) | `1.5.2` | `1.6.0` | | [github.com/Azure/go-autorest/autorest/azure/auth](https://github.com/Azure/go-autorest) | `0.5.12` | `0.5.13` | | [github.com/BurntSushi/toml](https://github.com/BurntSushi/toml) | `1.3.2` | `1.4.0` | | [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) | `1.53.6` | `1.54.2` | | [github.com/getsentry/sentry-go](https://github.com/getsentry/sentry-go) | `0.27.0` | `0.28.1` | | [github.com/gophercloud/gophercloud](https://github.com/gophercloud/gophercloud) | `1.11.0` | `1.12.0` | | [github.com/hashicorp/go-retryablehttp](https://github.com/hashicorp/go-retryablehttp) | `0.7.6` | `0.7.7` | | [github.com/openshift-online/ocm-sdk-go](https://github.com/openshift-online/ocm-sdk-go) | `0.1.420` | `0.1.425` | | [github.com/osbuild/images](https://github.com/osbuild/images) | `0.65.0` | `0.66.0` | | [github.com/spf13/cobra](https://github.com/spf13/cobra) | `1.8.0` | `1.8.1` | | [github.com/vmware/govmomi](https://github.com/vmware/govmomi) | `0.37.2` | `0.37.3` | Updates `cloud.google.com/go/storage` from 1.41.0 to 1.42.0 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.41.0...spanner/v1.42.0) Updates `github.com/Azure/azure-sdk-for-go/sdk/azidentity` from 1.5.2 to 1.6.0 - [Release notes](https://github.com/Azure/azure-sdk-for-go/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md) - [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/internal/v1.5.2...sdk/azcore/v1.6.0) Updates `github.com/Azure/go-autorest/autorest/azure/auth` from 0.5.12 to 0.5.13 - [Release notes](https://github.com/Azure/go-autorest/releases) - [Changelog](https://github.com/Azure/go-autorest/blob/main/CHANGELOG.md) - [Commits](https://github.com/Azure/go-autorest/compare/autorest/azure/auth/v0.5.12...autorest/azure/auth/v0.5.13) Updates `github.com/BurntSushi/toml` from 1.3.2 to 1.4.0 - [Release notes](https://github.com/BurntSushi/toml/releases) - [Commits](https://github.com/BurntSushi/toml/compare/v1.3.2...v1.4.0) Updates `github.com/aws/aws-sdk-go` from 1.53.6 to 1.54.2 - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.53.6...v1.54.2) Updates `github.com/getsentry/sentry-go` from 0.27.0 to 0.28.1 - [Release notes](https://github.com/getsentry/sentry-go/releases) - [Changelog](https://github.com/getsentry/sentry-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-go/compare/v0.27.0...v0.28.1) Updates `github.com/gophercloud/gophercloud` from 1.11.0 to 1.12.0 - [Release notes](https://github.com/gophercloud/gophercloud/releases) - [Changelog](https://github.com/gophercloud/gophercloud/blob/master/CHANGELOG.md) - [Commits](https://github.com/gophercloud/gophercloud/compare/v1.11.0...v1.12.0) Updates `github.com/hashicorp/go-retryablehttp` from 0.7.6 to 0.7.7 - [Changelog](https://github.com/hashicorp/go-retryablehttp/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/go-retryablehttp/compare/v0.7.6...v0.7.7) Updates `github.com/openshift-online/ocm-sdk-go` from 0.1.420 to 0.1.425 - [Release notes](https://github.com/openshift-online/ocm-sdk-go/releases) - [Changelog](https://github.com/openshift-online/ocm-sdk-go/blob/main/CHANGES.md) - [Commits](https://github.com/openshift-online/ocm-sdk-go/compare/v0.1.420...v0.1.425) Updates `github.com/osbuild/images` from 0.65.0 to 0.66.0 - [Release notes](https://github.com/osbuild/images/releases) - [Commits](https://github.com/osbuild/images/compare/v0.65.0...v0.66.0) Updates `github.com/spf13/cobra` from 1.8.0 to 1.8.1 - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.8.0...v1.8.1) Updates `github.com/vmware/govmomi` from 0.37.2 to 0.37.3 - [Release notes](https://github.com/vmware/govmomi/releases) - [Changelog](https://github.com/vmware/govmomi/blob/main/CHANGELOG.md) - [Commits](https://github.com/vmware/govmomi/compare/v0.37.2...v0.37.3) Updates `golang.org/x/oauth2` from 0.20.0 to 0.21.0 - [Commits](https://github.com/golang/oauth2/compare/v0.20.0...v0.21.0) Updates `golang.org/x/sys` from 0.20.0 to 0.21.0 - [Commits](https://github.com/golang/sys/compare/v0.20.0...v0.21.0) Updates `google.golang.org/api` from 0.181.0 to 0.183.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.181.0...v0.183.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/storage dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azidentity dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/Azure/go-autorest/autorest/azure/auth dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-deps - dependency-name: github.com/BurntSushi/toml dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/getsentry/sentry-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/gophercloud/gophercloud dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/hashicorp/go-retryablehttp dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-deps - dependency-name: github.com/openshift-online/ocm-sdk-go dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-deps - dependency-name: github.com/osbuild/images dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-deps - dependency-name: github.com/vmware/govmomi dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-deps - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps ... Signed-off-by: dependabot[bot] <support@github.com>
427 lines
6.7 KiB
Go
427 lines
6.7 KiB
Go
package sentry
|
|
|
|
import (
|
|
"fmt"
|
|
"hash/crc32"
|
|
"math"
|
|
"regexp"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
type (
|
|
NumberOrString interface {
|
|
int | string
|
|
}
|
|
|
|
void struct{}
|
|
)
|
|
|
|
var (
|
|
member void
|
|
keyRegex = regexp.MustCompile(`[^a-zA-Z0-9_/.-]+`)
|
|
valueRegex = regexp.MustCompile(`[^\w\d\s_:/@\.{}\[\]$-]+`)
|
|
unitRegex = regexp.MustCompile(`[^a-z]+`)
|
|
)
|
|
|
|
type MetricUnit struct {
|
|
unit string
|
|
}
|
|
|
|
func (m MetricUnit) toString() string {
|
|
return m.unit
|
|
}
|
|
|
|
func NanoSecond() MetricUnit {
|
|
return MetricUnit{
|
|
"nanosecond",
|
|
}
|
|
}
|
|
|
|
func MicroSecond() MetricUnit {
|
|
return MetricUnit{
|
|
"microsecond",
|
|
}
|
|
}
|
|
|
|
func MilliSecond() MetricUnit {
|
|
return MetricUnit{
|
|
"millisecond",
|
|
}
|
|
}
|
|
|
|
func Second() MetricUnit {
|
|
return MetricUnit{
|
|
"second",
|
|
}
|
|
}
|
|
|
|
func Minute() MetricUnit {
|
|
return MetricUnit{
|
|
"minute",
|
|
}
|
|
}
|
|
|
|
func Hour() MetricUnit {
|
|
return MetricUnit{
|
|
"hour",
|
|
}
|
|
}
|
|
|
|
func Day() MetricUnit {
|
|
return MetricUnit{
|
|
"day",
|
|
}
|
|
}
|
|
|
|
func Week() MetricUnit {
|
|
return MetricUnit{
|
|
"week",
|
|
}
|
|
}
|
|
|
|
func Bit() MetricUnit {
|
|
return MetricUnit{
|
|
"bit",
|
|
}
|
|
}
|
|
|
|
func Byte() MetricUnit {
|
|
return MetricUnit{
|
|
"byte",
|
|
}
|
|
}
|
|
|
|
func KiloByte() MetricUnit {
|
|
return MetricUnit{
|
|
"kilobyte",
|
|
}
|
|
}
|
|
|
|
func KibiByte() MetricUnit {
|
|
return MetricUnit{
|
|
"kibibyte",
|
|
}
|
|
}
|
|
|
|
func MegaByte() MetricUnit {
|
|
return MetricUnit{
|
|
"megabyte",
|
|
}
|
|
}
|
|
|
|
func MebiByte() MetricUnit {
|
|
return MetricUnit{
|
|
"mebibyte",
|
|
}
|
|
}
|
|
|
|
func GigaByte() MetricUnit {
|
|
return MetricUnit{
|
|
"gigabyte",
|
|
}
|
|
}
|
|
|
|
func GibiByte() MetricUnit {
|
|
return MetricUnit{
|
|
"gibibyte",
|
|
}
|
|
}
|
|
|
|
func TeraByte() MetricUnit {
|
|
return MetricUnit{
|
|
"terabyte",
|
|
}
|
|
}
|
|
|
|
func TebiByte() MetricUnit {
|
|
return MetricUnit{
|
|
"tebibyte",
|
|
}
|
|
}
|
|
|
|
func PetaByte() MetricUnit {
|
|
return MetricUnit{
|
|
"petabyte",
|
|
}
|
|
}
|
|
|
|
func PebiByte() MetricUnit {
|
|
return MetricUnit{
|
|
"pebibyte",
|
|
}
|
|
}
|
|
|
|
func ExaByte() MetricUnit {
|
|
return MetricUnit{
|
|
"exabyte",
|
|
}
|
|
}
|
|
|
|
func ExbiByte() MetricUnit {
|
|
return MetricUnit{
|
|
"exbibyte",
|
|
}
|
|
}
|
|
|
|
func Ratio() MetricUnit {
|
|
return MetricUnit{
|
|
"ratio",
|
|
}
|
|
}
|
|
|
|
func Percent() MetricUnit {
|
|
return MetricUnit{
|
|
"percent",
|
|
}
|
|
}
|
|
|
|
func CustomUnit(unit string) MetricUnit {
|
|
return MetricUnit{
|
|
unitRegex.ReplaceAllString(unit, ""),
|
|
}
|
|
}
|
|
|
|
type Metric interface {
|
|
GetType() string
|
|
GetTags() map[string]string
|
|
GetKey() string
|
|
GetUnit() string
|
|
GetTimestamp() int64
|
|
SerializeValue() string
|
|
SerializeTags() string
|
|
}
|
|
|
|
type abstractMetric struct {
|
|
key string
|
|
unit MetricUnit
|
|
tags map[string]string
|
|
// A unix timestamp (full seconds elapsed since 1970-01-01 00:00 UTC).
|
|
timestamp int64
|
|
}
|
|
|
|
func (am abstractMetric) GetTags() map[string]string {
|
|
return am.tags
|
|
}
|
|
|
|
func (am abstractMetric) GetKey() string {
|
|
return am.key
|
|
}
|
|
|
|
func (am abstractMetric) GetUnit() string {
|
|
return am.unit.toString()
|
|
}
|
|
|
|
func (am abstractMetric) GetTimestamp() int64 {
|
|
return am.timestamp
|
|
}
|
|
|
|
func (am abstractMetric) SerializeTags() string {
|
|
var sb strings.Builder
|
|
|
|
values := make([]string, 0, len(am.tags))
|
|
for k := range am.tags {
|
|
values = append(values, k)
|
|
}
|
|
sortSlice(values)
|
|
|
|
for _, key := range values {
|
|
val := sanitizeValue(am.tags[key])
|
|
key = sanitizeKey(key)
|
|
sb.WriteString(fmt.Sprintf("%s:%s,", key, val))
|
|
}
|
|
s := sb.String()
|
|
if len(s) > 0 {
|
|
s = s[:len(s)-1]
|
|
}
|
|
return s
|
|
}
|
|
|
|
// Counter Metric.
|
|
type CounterMetric struct {
|
|
value float64
|
|
abstractMetric
|
|
}
|
|
|
|
func (c *CounterMetric) Add(value float64) {
|
|
c.value += value
|
|
}
|
|
|
|
func (c CounterMetric) GetType() string {
|
|
return "c"
|
|
}
|
|
|
|
func (c CounterMetric) SerializeValue() string {
|
|
return fmt.Sprintf(":%v", c.value)
|
|
}
|
|
|
|
// timestamp: A unix timestamp (full seconds elapsed since 1970-01-01 00:00 UTC).
|
|
func NewCounterMetric(key string, unit MetricUnit, tags map[string]string, timestamp int64, value float64) CounterMetric {
|
|
am := abstractMetric{
|
|
key,
|
|
unit,
|
|
tags,
|
|
timestamp,
|
|
}
|
|
|
|
return CounterMetric{
|
|
value,
|
|
am,
|
|
}
|
|
}
|
|
|
|
// Distribution Metric.
|
|
type DistributionMetric struct {
|
|
values []float64
|
|
abstractMetric
|
|
}
|
|
|
|
func (d *DistributionMetric) Add(value float64) {
|
|
d.values = append(d.values, value)
|
|
}
|
|
|
|
func (d DistributionMetric) GetType() string {
|
|
return "d"
|
|
}
|
|
|
|
func (d DistributionMetric) SerializeValue() string {
|
|
var sb strings.Builder
|
|
for _, el := range d.values {
|
|
sb.WriteString(fmt.Sprintf(":%v", el))
|
|
}
|
|
return sb.String()
|
|
}
|
|
|
|
// timestamp: A unix timestamp (full seconds elapsed since 1970-01-01 00:00 UTC).
|
|
func NewDistributionMetric(key string, unit MetricUnit, tags map[string]string, timestamp int64, value float64) DistributionMetric {
|
|
am := abstractMetric{
|
|
key,
|
|
unit,
|
|
tags,
|
|
timestamp,
|
|
}
|
|
|
|
return DistributionMetric{
|
|
[]float64{value},
|
|
am,
|
|
}
|
|
}
|
|
|
|
// Gauge Metric.
|
|
type GaugeMetric struct {
|
|
last float64
|
|
min float64
|
|
max float64
|
|
sum float64
|
|
count float64
|
|
abstractMetric
|
|
}
|
|
|
|
func (g *GaugeMetric) Add(value float64) {
|
|
g.last = value
|
|
g.min = math.Min(g.min, value)
|
|
g.max = math.Max(g.max, value)
|
|
g.sum += value
|
|
g.count++
|
|
}
|
|
|
|
func (g GaugeMetric) GetType() string {
|
|
return "g"
|
|
}
|
|
|
|
func (g GaugeMetric) SerializeValue() string {
|
|
return fmt.Sprintf(":%v:%v:%v:%v:%v", g.last, g.min, g.max, g.sum, g.count)
|
|
}
|
|
|
|
// timestamp: A unix timestamp (full seconds elapsed since 1970-01-01 00:00 UTC).
|
|
func NewGaugeMetric(key string, unit MetricUnit, tags map[string]string, timestamp int64, value float64) GaugeMetric {
|
|
am := abstractMetric{
|
|
key,
|
|
unit,
|
|
tags,
|
|
timestamp,
|
|
}
|
|
|
|
return GaugeMetric{
|
|
value, // last
|
|
value, // min
|
|
value, // max
|
|
value, // sum
|
|
value, // count
|
|
am,
|
|
}
|
|
}
|
|
|
|
// Set Metric.
|
|
type SetMetric[T NumberOrString] struct {
|
|
values map[T]void
|
|
abstractMetric
|
|
}
|
|
|
|
func (s *SetMetric[T]) Add(value T) {
|
|
s.values[value] = member
|
|
}
|
|
|
|
func (s SetMetric[T]) GetType() string {
|
|
return "s"
|
|
}
|
|
|
|
func (s SetMetric[T]) SerializeValue() string {
|
|
_hash := func(s string) uint32 {
|
|
return crc32.ChecksumIEEE([]byte(s))
|
|
}
|
|
|
|
values := make([]T, 0, len(s.values))
|
|
for k := range s.values {
|
|
values = append(values, k)
|
|
}
|
|
sortSlice(values)
|
|
|
|
var sb strings.Builder
|
|
for _, el := range values {
|
|
switch any(el).(type) {
|
|
case int:
|
|
sb.WriteString(fmt.Sprintf(":%v", el))
|
|
case string:
|
|
s := fmt.Sprintf("%v", el)
|
|
sb.WriteString(fmt.Sprintf(":%d", _hash(s)))
|
|
}
|
|
}
|
|
|
|
return sb.String()
|
|
}
|
|
|
|
// timestamp: A unix timestamp (full seconds elapsed since 1970-01-01 00:00 UTC).
|
|
func NewSetMetric[T NumberOrString](key string, unit MetricUnit, tags map[string]string, timestamp int64, value T) SetMetric[T] {
|
|
am := abstractMetric{
|
|
key,
|
|
unit,
|
|
tags,
|
|
timestamp,
|
|
}
|
|
|
|
return SetMetric[T]{
|
|
map[T]void{
|
|
value: member,
|
|
},
|
|
am,
|
|
}
|
|
}
|
|
|
|
func sanitizeKey(s string) string {
|
|
return keyRegex.ReplaceAllString(s, "_")
|
|
}
|
|
|
|
func sanitizeValue(s string) string {
|
|
return valueRegex.ReplaceAllString(s, "")
|
|
}
|
|
|
|
type Ordered interface {
|
|
~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | ~float32 | ~float64 | ~string
|
|
}
|
|
|
|
func sortSlice[T Ordered](s []T) {
|
|
sort.Slice(s, func(i, j int) bool {
|
|
return s[i] < s[j]
|
|
})
|
|
}
|