Init: bootstrap
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
backend
|
||||
28
Makefile
Normal file
28
Makefile
Normal file
@@ -0,0 +1,28 @@
|
||||
.PHONY: all swagger docker install test bench
|
||||
|
||||
SWAG ?= go run github.com/swaggo/swag/cmd/swag@v1.16.4
|
||||
|
||||
GO_ENV += CGO_ENABLED=0
|
||||
SOURCE := $(shell find . -type f -name '*.go')
|
||||
TARGET := backend
|
||||
|
||||
all: swagger docker install
|
||||
|
||||
docker: $(TARGET)
|
||||
docker compose up -d --force-recreate --build backend
|
||||
|
||||
install:
|
||||
$(GO_ENV) go install
|
||||
|
||||
test:
|
||||
go test -v ./tests/units
|
||||
|
||||
bench:
|
||||
go test -bench=. ./tests/benchmarks
|
||||
|
||||
swagger:
|
||||
$(SWAG) fmt
|
||||
$(SWAG) init -o docs -g cmds/serve.go -pdl 1
|
||||
|
||||
$(TARGET): $(SOURCE)
|
||||
$(GO_ENV) go build -o $@
|
||||
7
backend.go
Normal file
7
backend.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package main
|
||||
|
||||
import "gitea.konchin.com/go2025/backend/cmds"
|
||||
|
||||
func main() {
|
||||
cmds.RootCmd.Execute()
|
||||
}
|
||||
24
cmds/root.go
Normal file
24
cmds/root.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package cmds
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
var RootCmd = &cobra.Command{
|
||||
Use: "root",
|
||||
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
||||
viper.AutomaticEnv()
|
||||
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
|
||||
viper.BindPFlags(cmd.PersistentFlags())
|
||||
viper.BindPFlags(cmd.Flags())
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
cobra.EnableTraverseRunHooks = true
|
||||
|
||||
RootCmd.AddCommand(serveCmd)
|
||||
}
|
||||
115
cmds/serve.go
Normal file
115
cmds/serve.go
Normal file
@@ -0,0 +1,115 @@
|
||||
package cmds
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"gitea.konchin.com/go2025/backend/tracing"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
"go.uber.org/zap"
|
||||
|
||||
_ "gitea.konchin.com/go2025/backend/docs"
|
||||
)
|
||||
|
||||
// @title Golang 2025 Final Project
|
||||
// @version 0.0.1
|
||||
// @termsOfService http://swagger.io/terms
|
||||
//
|
||||
// @license.name 0BSD
|
||||
// @basePath /
|
||||
var serveCmd = &cobra.Command{
|
||||
Use: "serve",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
ctx := cmd.Context()
|
||||
|
||||
// Initialize tracing
|
||||
appname := "go2025-backend"
|
||||
tracing.InitTracer(appname)
|
||||
if viper.GetString("uptrace-dsn") != "" {
|
||||
tracing.InitUptrace(appname)
|
||||
defer tracing.DeferUptrace(ctx)
|
||||
}
|
||||
|
||||
// Initialize DB instance
|
||||
sqldb := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(
|
||||
viper.GetString("pg-connection-string"))))
|
||||
bunDB := bun.NewDB(sqldb, pgdialect.New())
|
||||
bunDB.AddQueryHook(bunotel.NewQueryHook(bunotel.WithDBName("backend")))
|
||||
|
||||
// Initialize MinIO instance
|
||||
mc, err := minio.New(viper.GetString("minio-host"), &minio.Options{
|
||||
Creds: credentials.NewStaticV4(
|
||||
viper.GetString("minio-accesskey"),
|
||||
viper.GetString("minio-secretkey"),
|
||||
"",
|
||||
),
|
||||
Secure: viper.GetBool("minio-usessl"),
|
||||
})
|
||||
if err != nil {
|
||||
tracing.Logger.Ctx(ctx).
|
||||
Error("failed to create minio client",
|
||||
zap.Error(err))
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := utils.InitMinIO(ctx, mc); err != nil {
|
||||
tracing.Logger.Ctx(ctx).
|
||||
Error("failed to minio init",
|
||||
zap.Error(err))
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Initialize custom interfaces
|
||||
db := implements.NewBunDatabase(bunDB)
|
||||
s3 := implements.NewMinIOObjectStorage(mc)
|
||||
|
||||
// Initialize backend router
|
||||
router := bunrouter.New()
|
||||
backend := router.NewGroup("").
|
||||
Use(middlewares.ErrorHandler).
|
||||
Use(middlewares.BunrouterOtel).
|
||||
Use(middlewares.AccessLog).
|
||||
Use(middlewares.CORSHandler)
|
||||
|
||||
if viper.GetBool("swagger") {
|
||||
backend.GET("/swagger/*any",
|
||||
bunrouter.HTTPHandlerFunc(
|
||||
httpSwagger.Handler()))
|
||||
}
|
||||
|
||||
log.Println(http.ListenAndServe(
|
||||
":"+viper.GetString("port"),
|
||||
otelhttp.NewHandler(router, "")))
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
serveCmd.Flags().
|
||||
String("port", "8080", "Port to listen on")
|
||||
|
||||
serveCmd.Flags().
|
||||
Bool("zap-production", true, "Toggle production log format")
|
||||
serveCmd.Flags().
|
||||
Bool("swagger", false, "Toggle swagger")
|
||||
|
||||
serveCmd.Flags().
|
||||
String("pg-connection-string",
|
||||
"postgres://go2025:go2025@pg:5432/go2025?sslmode=disable",
|
||||
"Postgres connection string")
|
||||
|
||||
backendCmd.Flags().
|
||||
String("minio-host", "minio:9000", "MinIO host[:port]")
|
||||
backendCmd.Flags().
|
||||
String("minio-bucket", "go2025", "MinIO bucket")
|
||||
backendCmd.Flags().
|
||||
String("minio-accesskey", "poop", "MinIO accesskey")
|
||||
backendCmd.Flags().
|
||||
String("minio-secretkey", "poop", "MinIO secretkey")
|
||||
backendCmd.Flags().
|
||||
Bool("minio-usessl", false, "MinIO usessl")
|
||||
|
||||
serveCmd.Flags().
|
||||
String("uptrace-dsn", "", "Uptrace DSN (disabled by default)")
|
||||
}
|
||||
73
docker-compose.yml
Normal file
73
docker-compose.yml
Normal file
@@ -0,0 +1,73 @@
|
||||
---
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:17.2
|
||||
environment:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: poop
|
||||
ports:
|
||||
- 5432:5432
|
||||
volumes:
|
||||
- ./docker/postgres/:/docker-entrypoint-initdb.d/
|
||||
- postgres:/var/lib/postgresql/data
|
||||
restart: unless-stopped
|
||||
|
||||
minio:
|
||||
image: minio/minio:RELEASE.2025-07-23T15-54-02Z
|
||||
environment:
|
||||
MINIO_ROOT_USER: poop
|
||||
MINIO_ROOT_PASSWORD: poop
|
||||
command: ["server", "/data", "--console-address", ":9001"]
|
||||
ports:
|
||||
- 9000:9000
|
||||
- 9001:9001
|
||||
volumes:
|
||||
- minio:/data
|
||||
restart: unless-stopped
|
||||
|
||||
clickhouse:
|
||||
image: library/clickhouse:25.7.4
|
||||
environment:
|
||||
CLICKHOUSE_USER: uptrace
|
||||
CLICKHOUSE_PASSWORD: uptrace
|
||||
CLICKHOUSE_DB: uptrace
|
||||
ports:
|
||||
- 8123:8123
|
||||
#- 9000:9000
|
||||
volumes:
|
||||
- clickhouse:/var/lib/clickhouse
|
||||
restart: unless-stopped
|
||||
|
||||
uptrace:
|
||||
image: uptrace/uptrace:2.0.1
|
||||
ports:
|
||||
- 14317:14317
|
||||
- 14318:14318
|
||||
volumes:
|
||||
- ./docker/uptrace/config.yml:/etc/uptrace/config.yml
|
||||
depends_on:
|
||||
- postgres
|
||||
- clickhouse
|
||||
restart: unless-stopped
|
||||
|
||||
backend:
|
||||
build:
|
||||
context: .
|
||||
target: backend_runtime
|
||||
env_file:
|
||||
- path: ./.env
|
||||
ports:
|
||||
- 8080:8080
|
||||
volumes:
|
||||
- './:/data'
|
||||
depends_on:
|
||||
- postgres
|
||||
- minio
|
||||
- uptrace
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
redis: {}
|
||||
postgres: {}
|
||||
minio: {}
|
||||
clickhouse: {}
|
||||
4
docker/postgres/backend.sql
Normal file
4
docker/postgres/backend.sql
Normal file
@@ -0,0 +1,4 @@
|
||||
CREATE USER go2025;
|
||||
CREATE DATABASE go2025;
|
||||
ALTER DATABASE go2025 OWNER TO go2025;
|
||||
ALTER USER go2025 ENCRYPTED PASSWORD 'go2025';
|
||||
435
docker/uptrace/config.yml
Normal file
435
docker/uptrace/config.yml
Normal file
@@ -0,0 +1,435 @@
|
||||
# =============================================================================
|
||||
# Uptrace Configuration
|
||||
# =============================================================================
|
||||
# Complete configuration reference: https://uptrace.dev/get/hosted/config
|
||||
#
|
||||
# Environment Variable Support:
|
||||
# - Simple substitution: foo: $FOO
|
||||
# - With braces: bar: ${BAR}
|
||||
# - With defaults: baz: ${BAZ:default_value}
|
||||
# - To escape '$': foo: $$FOO_BAR
|
||||
# =============================================================================
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Service Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
# Core service settings that define the runtime environment and security
|
||||
service:
|
||||
env: hosted # Environment: hosted, development, production
|
||||
secret: poop # Secret key for cryptographic operations (CHANGE THIS!)
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Site Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
# External-facing URLs and endpoints for client connections
|
||||
site:
|
||||
# Primary URL where users access the Uptrace UI and API
|
||||
# This URL is used for:
|
||||
# - Generating dashboard links in notifications
|
||||
# - CORS validation for browser requests
|
||||
# - Redirect URIs for authentication flows
|
||||
# IMPORTANT: Must be accessible from all clients and match your reverse proxy setup
|
||||
url: http://localhost:14318
|
||||
|
||||
# Dedicated URL for telemetry data ingestion (OTLP endpoints)
|
||||
# Use this to separate data ingestion from UI traffic for:
|
||||
# - Load balancing optimization
|
||||
# - Different security policies
|
||||
# - CDN/edge deployment scenarios
|
||||
# If empty, defaults to site.url
|
||||
ingest_url: http://localhost:14318?grpc=14317
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Network Listeners
|
||||
# -----------------------------------------------------------------------------
|
||||
# Configure network interfaces and ports for different protocols
|
||||
listen:
|
||||
# HTTP server configuration
|
||||
# Handles: OTLP/HTTP API, REST API, and Vue.js web interface
|
||||
http:
|
||||
# Network address and port to bind to
|
||||
# Format: [host]:port or :port (binds to all interfaces)
|
||||
# Common values: :80, :8080, localhost:8080
|
||||
addr: :14318
|
||||
|
||||
# gRPC server configuration
|
||||
# Handles: OTLP/gRPC API for high-performance telemetry ingestion
|
||||
# Standard OTLP gRPC port is 4317
|
||||
grpc:
|
||||
addr: :14317
|
||||
|
||||
# TLS/SSL configuration for HTTPS and secure gRPC
|
||||
# Uncomment and configure for production deployments
|
||||
#tls:
|
||||
# cert_file: /etc/uptrace/server.crt
|
||||
# key_file: /etc/uptrace/server.key
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Authentication & Authorization
|
||||
# -----------------------------------------------------------------------------
|
||||
# User authentication and access control settings
|
||||
auth:
|
||||
# Disable built-in username/password authentication
|
||||
# Useful when using only SSO providers (OAuth, SAML, etc.)
|
||||
# Note: SSO authentication methods will remain available
|
||||
#disabled: true
|
||||
|
||||
# Email domain restriction for user registration
|
||||
# Only users with email addresses matching this regex can register/login
|
||||
# Examples:
|
||||
# - '^.+@example\.com$' - only @example.com domain
|
||||
# - '^.+@(example|acme)\.com$' - multiple domains
|
||||
# - '^[^@]+@example\.com$' - stricter validation
|
||||
#email_regexp: '^.+@example\.com$'
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Bootstrap Data
|
||||
# -----------------------------------------------------------------------------
|
||||
# Initial data created during first startup - defines default users, organizations, and projects
|
||||
# This data is only created once and can be modified through the UI afterward
|
||||
seed_data:
|
||||
update: true # Whether to update existing resources by key
|
||||
delete: true # Whether to delete disappeared resources by key
|
||||
|
||||
# Default users created on first startup
|
||||
users:
|
||||
- key: user1 # Internal reference key (used in relationships below)
|
||||
name: Admin # Display name in UI
|
||||
email: admin@uptrace.local # Login email (must be unique)
|
||||
password: admin # Plain text password (CHANGE THIS IMMEDIATELY!)
|
||||
email_confirmed: true
|
||||
|
||||
# API tokens for user authentication
|
||||
# These tokens can be used for API access and programmatic operations
|
||||
user_tokens:
|
||||
- key: user_token1 # Internal reference key
|
||||
user_key: user1 # References user.key above
|
||||
token: poop # API token value (CHANGE THIS!)
|
||||
|
||||
# Organizations for multi-tenant deployments
|
||||
# Organizations group users and projects together
|
||||
orgs:
|
||||
- key: org1 # Internal reference key
|
||||
name: CSIT # Organization display name
|
||||
|
||||
# Organization membership and roles
|
||||
# Defines which users belong to which organizations
|
||||
org_users:
|
||||
- key: org_user1 # Internal reference key
|
||||
org_key: org1 # References org.key above
|
||||
user_key: user1 # References user.key above
|
||||
role: owner # Role: owner, admin, or member
|
||||
|
||||
# Projects contain telemetry data and are isolated from each other
|
||||
# Each project has its own spans, logs, metrics, and dashboards
|
||||
projects:
|
||||
- key: self
|
||||
name: Uptrace
|
||||
org_key: org1
|
||||
- key: project1 # Internal reference key
|
||||
name: Go2025 # Project display name
|
||||
org_key: org1 # References org.key above
|
||||
|
||||
# Project-specific tokens for telemetry data ingestion
|
||||
# These tokens are used in OTLP DSN strings for sending data
|
||||
project_tokens:
|
||||
- key: project_token2
|
||||
project_key: self
|
||||
token: poop_token2
|
||||
- key: project_token1 # Internal reference key
|
||||
project_key: project1 # References project.key above
|
||||
token: poop # Token value for DSN (CHANGE THIS!)
|
||||
|
||||
# Project user permissions
|
||||
# Controls who can access and modify project data
|
||||
project_users:
|
||||
- key: project_user1 # Internal reference key
|
||||
project_key: project1 # References project.key above
|
||||
org_user_key: org_user1 # References org_user.key above
|
||||
perm_level: admin # Permission level: admin, editor, or viewer
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# ClickHouse Database Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
# Primary storage for high-volume telemetry data (spans, logs, metrics)
|
||||
# ClickHouse is optimized for analytical queries and time-series data
|
||||
ch_cluster:
|
||||
# Cluster name for ClickHouse operations
|
||||
# Used internally for distributed queries and table management
|
||||
cluster: uptrace1
|
||||
|
||||
# Enable ClickHouse replicated tables for high availability
|
||||
# Requires cluster configuration with multiple replicas
|
||||
# Provides automatic failover and data redundancy
|
||||
replicated: false
|
||||
|
||||
# Enable ClickHouse distributed tables for horizontal scaling
|
||||
# Requires cluster configuration across multiple shards
|
||||
# Only available in Premium Edition
|
||||
distributed: false
|
||||
|
||||
# Database shards configuration
|
||||
# Each shard can have multiple replicas for redundancy
|
||||
shards:
|
||||
- replicas:
|
||||
- addr: clickhouse:9000 # ClickHouse server address
|
||||
database: uptrace # Database name (must exist)
|
||||
user: uptrace # Database user with write permissions
|
||||
password: uptrace # Database password
|
||||
|
||||
# Connection timeout settings
|
||||
dial_timeout: 3s # Time to wait for connection establishment
|
||||
write_timeout: 5s # Time to wait for write operations
|
||||
max_retries: 3 # Number of retry attempts for failed operations
|
||||
|
||||
# Query execution timeout
|
||||
# Prevents long-running queries from consuming resources
|
||||
max_execution_time: 15s
|
||||
|
||||
# TLS configuration for secure database connections
|
||||
# Uncomment for production deployments with SSL/TLS
|
||||
#tls:
|
||||
# insecure_skip_verify: true # WARNING: Only use for self-signed certificates
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# PostgreSQL Database Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
# Metadata storage for application data (users, projects, dashboards, alerts, etc.)
|
||||
# PostgreSQL provides ACID compliance for critical application state
|
||||
pg:
|
||||
addr: postgres:5432 # PostgreSQL server address
|
||||
user: uptrace # Database user with full permissions
|
||||
password: uptrace # Database password
|
||||
database: uptrace # Database name (must exist)
|
||||
|
||||
# TLS configuration for secure database connections
|
||||
# Recommended for production deployments
|
||||
#tls:
|
||||
# insecure_skip_verify: true # WARNING: Only use for self-signed certificates
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# ClickHouse Schema Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
# Advanced schema settings for performance optimization
|
||||
# WARNING: Changes require 'ch reset' command and will delete all data
|
||||
ch_schema:
|
||||
# Data compression algorithm for storage efficiency
|
||||
# Options:
|
||||
# - LZ4: Fast compression/decompression, moderate compression ratio
|
||||
# - ZSTD(1): Better compression ratio, slightly slower
|
||||
# - Default: ClickHouse default compression
|
||||
compression: ZSTD(1)
|
||||
|
||||
# Storage policies for different data types
|
||||
# Allows using different storage tiers (SSD, HDD, S3) for different data
|
||||
spans_index: { storage_policy: default } # Span search indexes
|
||||
spans_data: { storage_policy: default } # Raw span data
|
||||
span_links: { storage_policy: default } # Span relationship data
|
||||
logs_index: { storage_policy: default } # Log search indexes
|
||||
logs_data: { storage_policy: default } # Raw log data
|
||||
events_index: { storage_policy: default } # Event search indexes
|
||||
events_data: { storage_policy: default } # Raw event data
|
||||
metrics: { storage_policy: default } # Metrics time-series data
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Redis Cache Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
# In-memory cache for improved query performance and session storage
|
||||
# Reduces database load and improves response times
|
||||
redis_cache:
|
||||
# Redis server addresses
|
||||
# For cluster setup, add multiple addresses
|
||||
addrs:
|
||||
1: redis:6379
|
||||
|
||||
# Redis authentication credentials
|
||||
username: "" # Redis username (Redis 6.0+)
|
||||
password: "" # Redis password
|
||||
db: 15 # Redis database number (0-15)
|
||||
|
||||
# TLS configuration for secure Redis connections
|
||||
# Recommended for production deployments
|
||||
#tls:
|
||||
# insecure_skip_verify: true # WARNING: Only use for self-signed certificates
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# SSL/TLS Certificate Management
|
||||
# -----------------------------------------------------------------------------
|
||||
# Automatic certificate issuance and renewal via Let's Encrypt ACME protocol
|
||||
certmagic:
|
||||
enabled: false # Enable automatic certificate management
|
||||
staging_ca: false # Use Let's Encrypt staging environment for testing
|
||||
http_challenge_addr: :80 # Address for HTTP-01 challenge validation
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Email Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
# SMTP configuration for alert notifications and user management emails
|
||||
# Required for: password resets, alert notifications, user invitations
|
||||
# Documentation: https://uptrace.dev/features/alerting
|
||||
mailer:
|
||||
smtp:
|
||||
enabled: false # Enable email notifications
|
||||
host: localhost # SMTP server hostname
|
||||
port: 1025 # SMTP server port (25, 465, 587, 1025)
|
||||
username: mailhog # SMTP authentication username
|
||||
password: mailhog # SMTP authentication password
|
||||
from: no-reply@uptrace.local # Sender email address (must be authorized)
|
||||
|
||||
# TLS configuration
|
||||
# Most production SMTP servers require TLS
|
||||
#tls: { insecure: true } # Uncomment to disable opportunistic TLS
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Telemetry Data Processing Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
# Performance tuning for different types of telemetry data ingestion
|
||||
|
||||
# Spans (distributed tracing data)
|
||||
# Contains trace information showing request flow across services
|
||||
spans:
|
||||
# Number of parallel processing threads
|
||||
# Default: GOMAXPROCS (number of CPU cores)
|
||||
# Increase for high-volume tracing workloads
|
||||
#max_threads: 10
|
||||
|
||||
# Batch size for database insertions
|
||||
# Larger batches improve throughput but increase memory usage
|
||||
# Tune based on your ingestion rate and memory constraints
|
||||
#max_insert_size: 10000
|
||||
|
||||
# In-memory buffer capacity for incoming spans
|
||||
# Spans are dropped when buffer is full (check metrics for drops)
|
||||
# Default scales with max_threads
|
||||
#max_buffered_records: 100e3
|
||||
|
||||
# Span links (relationships between spans)
|
||||
# Used for connecting spans across trace boundaries
|
||||
span_links:
|
||||
# Uncomment to disable span link processing
|
||||
# This saves resources if you don't use span links
|
||||
#disabled: true
|
||||
|
||||
#max_threads: 10 # Processing parallelism
|
||||
#max_insert_size: 10000 # Batch size for insertions
|
||||
#max_buffered_records: 100e3 # Buffer capacity
|
||||
|
||||
# Application logs
|
||||
# Structured and unstructured log data from applications
|
||||
logs:
|
||||
#max_threads: 10 # Processing parallelism
|
||||
#max_insert_size: 10000 # Batch size for insertions
|
||||
#max_buffered_records: 100e3 # Buffer capacity
|
||||
|
||||
# Custom events
|
||||
# Application-specific events and business metrics
|
||||
events:
|
||||
#max_threads: 10 # Processing parallelism
|
||||
#max_insert_size: 10000 # Batch size for insertions
|
||||
#max_buffered_records: 100e3 # Buffer capacity
|
||||
|
||||
# Metrics and time series data
|
||||
# Numerical measurements over time (counters, gauges, histograms)
|
||||
metrics:
|
||||
#max_threads: 10 # Processing parallelism
|
||||
#max_insert_size: 10000 # Batch size for insertions
|
||||
#max_buffered_records: 100e3 # Buffer capacity
|
||||
|
||||
# Memory limit for cumulative to delta conversion
|
||||
# Affects processing of cumulative counters from OpenTelemetry
|
||||
#max_cumulative_timeseries: 1e6
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Query & Performance Limits
|
||||
# -----------------------------------------------------------------------------
|
||||
# Resource limits to prevent expensive queries from affecting system performance
|
||||
|
||||
# Trace query resource limits
|
||||
trace:
|
||||
# Maximum number of spans to return in a single query
|
||||
# Prevents UI timeouts and excessive memory usage
|
||||
# Users can adjust time ranges to stay within limits
|
||||
#query_limit: 200_000
|
||||
|
||||
# Maximum memory usage per query (in bytes)
|
||||
# Prevents OOM errors from complex queries
|
||||
# Adjust based on available system memory
|
||||
#max_memory_usage_bytes: 200_000_000
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Feature Modules
|
||||
# -----------------------------------------------------------------------------
|
||||
# Optional features that can be enabled/disabled for performance or security
|
||||
|
||||
# Monitoring and alerting system
|
||||
# Provides proactive monitoring with notifications
|
||||
alerting:
|
||||
# Uncomment to disable the entire alerting system
|
||||
# This saves resources if you don't use monitoring alerts
|
||||
#disabled: true
|
||||
|
||||
# Service dependency graph generation
|
||||
# Automatically builds service topology from trace data
|
||||
service_graph:
|
||||
# Uncomment to disable service graph processing
|
||||
# This saves CPU and memory if you don't use the service map
|
||||
#disabled: true
|
||||
|
||||
# JavaScript error sourcemap processing
|
||||
# Provides better error stack traces for frontend applications
|
||||
# Requires internet access to download source maps from URLs
|
||||
sourcemaps:
|
||||
# Uncomment to disable sourcemap processing
|
||||
# Disable in air-gapped environments or if not using JS error tracking
|
||||
#disabled: true
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# External Services
|
||||
# -----------------------------------------------------------------------------
|
||||
# Integration with external services and self-monitoring
|
||||
|
||||
# Internal telemetry collection
|
||||
# Uptrace monitors itself and sends telemetry to the configured DSN
|
||||
self_monitoring:
|
||||
# Uncomment to disable self-monitoring
|
||||
# This prevents Uptrace from generating its own telemetry data
|
||||
#disabled: true
|
||||
|
||||
# DSN for internal telemetry
|
||||
# Format: http://project_token@host?grpc=port
|
||||
# This can point to a project in this Uptrace instance or to the Uptrace Cloud
|
||||
dsn: http://poop_token2@uptrace:14318?grpc=14317
|
||||
|
||||
#tls:
|
||||
# insecure_skip_verify: true
|
||||
|
||||
# Telegram bot for notifications
|
||||
# Enables sending alert notifications to Telegram channels/users
|
||||
# Setup guide: https://sendpulse.com/knowledge-base/chatbot/telegram/create-telegram-chatbot
|
||||
telegram:
|
||||
# Telegram bot token obtained from @BotFather
|
||||
# Required for sending notifications to Telegram
|
||||
bot_token: ''
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# System Configuration
|
||||
# -----------------------------------------------------------------------------
|
||||
# Global system settings and licensing
|
||||
|
||||
# Application logging configuration
|
||||
# Controls Uptrace's own log output (not application logs)
|
||||
logging:
|
||||
# Log level affects verbosity and performance
|
||||
# DEBUG: Very verbose, use only for troubleshooting
|
||||
# INFO: Standard operational information
|
||||
# WARN: Warning messages and errors
|
||||
# ERROR: Only error messages
|
||||
level: INFO
|
||||
|
||||
# Premium features license
|
||||
# Enables advanced features like distributed tables, SSO, etc.
|
||||
# Details: https://uptrace.dev/get/hosted#premium-edition
|
||||
license:
|
||||
# Premium license key from Uptrace
|
||||
# Required for enterprise features
|
||||
key: ''
|
||||
40
docs/docs.go
Normal file
40
docs/docs.go
Normal file
@@ -0,0 +1,40 @@
|
||||
// Package docs Code generated by swaggo/swag. DO NOT EDIT
|
||||
package docs
|
||||
|
||||
import "github.com/swaggo/swag"
|
||||
|
||||
const docTemplate = `{
|
||||
"schemes": {{ marshal .Schemes }},
|
||||
"swagger": "2.0",
|
||||
"info": {
|
||||
"description": "{{escape .Description}}",
|
||||
"title": "{{.Title}}",
|
||||
"termsOfService": "http://swagger.io/terms",
|
||||
"contact": {},
|
||||
"license": {
|
||||
"name": "0BSD"
|
||||
},
|
||||
"version": "{{.Version}}"
|
||||
},
|
||||
"host": "{{.Host}}",
|
||||
"basePath": "{{.BasePath}}",
|
||||
"paths": {}
|
||||
}`
|
||||
|
||||
// SwaggerInfo holds exported Swagger Info so clients can modify it
|
||||
var SwaggerInfo = &swag.Spec{
|
||||
Version: "0.0.1",
|
||||
Host: "",
|
||||
BasePath: "/",
|
||||
Schemes: []string{},
|
||||
Title: "Golang 2025 Final Project",
|
||||
Description: "",
|
||||
InfoInstanceName: "swagger",
|
||||
SwaggerTemplate: docTemplate,
|
||||
LeftDelim: "{{",
|
||||
RightDelim: "}}",
|
||||
}
|
||||
|
||||
func init() {
|
||||
swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo)
|
||||
}
|
||||
14
docs/swagger.json
Normal file
14
docs/swagger.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"swagger": "2.0",
|
||||
"info": {
|
||||
"title": "Golang 2025 Final Project",
|
||||
"termsOfService": "http://swagger.io/terms",
|
||||
"contact": {},
|
||||
"license": {
|
||||
"name": "0BSD"
|
||||
},
|
||||
"version": "0.0.1"
|
||||
},
|
||||
"basePath": "/",
|
||||
"paths": {}
|
||||
}
|
||||
10
docs/swagger.yaml
Normal file
10
docs/swagger.yaml
Normal file
@@ -0,0 +1,10 @@
|
||||
basePath: /
|
||||
info:
|
||||
contact: {}
|
||||
license:
|
||||
name: 0BSD
|
||||
termsOfService: http://swagger.io/terms
|
||||
title: Golang 2025 Final Project
|
||||
version: 0.0.1
|
||||
paths: {}
|
||||
swagger: "2.0"
|
||||
68
go.mod
Normal file
68
go.mod
Normal file
@@ -0,0 +1,68 @@
|
||||
module gitea.konchin.com/go2025/backend
|
||||
|
||||
go 1.25.4
|
||||
|
||||
require (
|
||||
github.com/spf13/cobra v1.10.2
|
||||
github.com/spf13/viper v1.21.0
|
||||
github.com/swaggo/swag v1.16.6
|
||||
github.com/uptrace/opentelemetry-go-extra/otelzap v0.3.2
|
||||
github.com/uptrace/uptrace-go v1.38.0
|
||||
go.opentelemetry.io/otel v1.38.0
|
||||
go.opentelemetry.io/otel/trace v1.38.0
|
||||
go.uber.org/zap v1.27.1
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/KyleBanks/depth v1.2.1 // indirect
|
||||
github.com/PuerkitoBio/purell v1.1.1 // indirect
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
|
||||
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
|
||||
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||
github.com/go-logr/logr v1.4.3 // indirect
|
||||
github.com/go-logr/stdr v1.2.2 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.19.5 // indirect
|
||||
github.com/go-openapi/jsonreference v0.19.6 // indirect
|
||||
github.com/go-openapi/spec v0.20.4 // indirect
|
||||
github.com/go-openapi/swag v0.19.15 // indirect
|
||||
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
|
||||
github.com/google/uuid v1.6.0 // indirect
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/mailru/easyjson v0.7.6 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||||
github.com/sagikazarmark/locafero v0.11.0 // indirect
|
||||
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect
|
||||
github.com/spf13/afero v1.15.0 // indirect
|
||||
github.com/spf13/cast v1.10.0 // indirect
|
||||
github.com/spf13/pflag v1.0.10 // indirect
|
||||
github.com/subosito/gotenv v1.6.0 // indirect
|
||||
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2 // indirect
|
||||
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/runtime v0.63.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 // indirect
|
||||
go.opentelemetry.io/otel/log v0.14.0 // indirect
|
||||
go.opentelemetry.io/otel/metric v1.38.0 // indirect
|
||||
go.opentelemetry.io/otel/sdk v1.38.0 // indirect
|
||||
go.opentelemetry.io/otel/sdk/log v0.14.0 // indirect
|
||||
go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect
|
||||
go.opentelemetry.io/proto/otlp v1.8.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
||||
golang.org/x/mod v0.27.0 // indirect
|
||||
golang.org/x/net v0.44.0 // indirect
|
||||
golang.org/x/sync v0.17.0 // indirect
|
||||
golang.org/x/sys v0.36.0 // indirect
|
||||
golang.org/x/text v0.29.0 // indirect
|
||||
golang.org/x/tools v0.36.0 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 // indirect
|
||||
google.golang.org/grpc v1.75.1 // indirect
|
||||
google.golang.org/protobuf v1.36.9 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
)
|
||||
176
go.sum
Normal file
176
go.sum
Normal file
@@ -0,0 +1,176 @@
|
||||
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
|
||||
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
|
||||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
|
||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
|
||||
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
|
||||
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
|
||||
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||
github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
|
||||
github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
|
||||
github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
|
||||
github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
|
||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
|
||||
github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
|
||||
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
|
||||
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
|
||||
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
|
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs=
|
||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
|
||||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
||||
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
||||
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc=
|
||||
github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik=
|
||||
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=
|
||||
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U=
|
||||
github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
|
||||
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
|
||||
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
|
||||
github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
|
||||
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
|
||||
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
|
||||
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
|
||||
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
|
||||
github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
||||
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
|
||||
github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI=
|
||||
github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg=
|
||||
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2 h1:3/aHKUq7qaFMWxyQV0W2ryNgg8x8rVeKVA20KJUkfS0=
|
||||
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2/go.mod h1:Zit4b8AQXaXvA68+nzmbyDzqiyFRISyw1JiD5JqUBjw=
|
||||
github.com/uptrace/opentelemetry-go-extra/otelzap v0.3.2 h1:cj/Z6FKTTYBnstI0Lni9PA+k2foounKIPUmj1LBwNiQ=
|
||||
github.com/uptrace/opentelemetry-go-extra/otelzap v0.3.2/go.mod h1:LDaXk90gKEC2nC7JH3Lpnhfu+2V7o/TsqomJJmqA39o=
|
||||
github.com/uptrace/uptrace-go v1.38.0 h1:QdJfyQkaz7HNPbqM9OkaQ2L9jfdf0DpfZJv9em7YIgE=
|
||||
github.com/uptrace/uptrace-go v1.38.0/go.mod h1:SdE9nA+/y+SOIzatuIK2tZeYhoWgrAzAr08kJEquZyM=
|
||||
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
|
||||
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
|
||||
go.opentelemetry.io/contrib/instrumentation/runtime v0.63.0 h1:PeBoRj6af6xMI7qCupwFvTbbnd49V7n5YpG6pg8iDYQ=
|
||||
go.opentelemetry.io/contrib/instrumentation/runtime v0.63.0/go.mod h1:ingqBCtMCe8I4vpz/UVzCW6sxoqgZB37nao91mLQ3Bw=
|
||||
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
|
||||
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0 h1:QQqYw3lkrzwVsoEX0w//EhH/TCnpRdEenKBOOEIMjWc=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.14.0/go.mod h1:gSVQcr17jk2ig4jqJ2DX30IdWH251JcNAecvrqTxH1s=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 h1:Oe2z/BCg5q7k4iXC3cqJxKYg0ieRiOqF0cecFYdPTwk=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0/go.mod h1:ZQM5lAJpOsKnYagGg/zV2krVqTtaVdYdDkhMoX6Oalg=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4=
|
||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 h1:kJxSDN4SgWWTjG/hPp3O7LCGLcHXFlvS2/FFOrwL+SE=
|
||||
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0/go.mod h1:mgIOzS7iZeKJdeB8/NYHrJ48fdGc71Llo5bJ1J4DWUE=
|
||||
go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM=
|
||||
go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno=
|
||||
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
|
||||
go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=
|
||||
go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E=
|
||||
go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg=
|
||||
go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg=
|
||||
go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM=
|
||||
go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM=
|
||||
go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
|
||||
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
|
||||
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
|
||||
go.opentelemetry.io/proto/otlp v1.8.0 h1:fRAZQDcAFHySxpJ1TwlA1cJ4tvcrw7nXl9xWWC8N5CE=
|
||||
go.opentelemetry.io/proto/otlp v1.8.0/go.mod h1:tIeYOeNBU4cvmPqpaji1P+KbB4Oloai8wN4rWzRrFF0=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||
go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
|
||||
go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
|
||||
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
|
||||
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
|
||||
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
|
||||
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
|
||||
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
|
||||
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
|
||||
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
|
||||
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
||||
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
|
||||
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
|
||||
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
|
||||
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
|
||||
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
|
||||
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090 h1:d8Nakh1G+ur7+P3GcMjpRDEkoLUcLW2iU92XVqR+XMQ=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090/go.mod h1:U8EXRNSd8sUYyDfs/It7KVWodQr+Hf9xtxyxWudSwEw=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 h1:/OQuEa4YWtDt7uQWHd3q3sUMb+QOLQUg1xa8CEsRv5w=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og=
|
||||
google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI=
|
||||
google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
|
||||
google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
|
||||
google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
7
go.work.sum
Normal file
7
go.work.sum
Normal file
@@ -0,0 +1,7 @@
|
||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
||||
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
|
||||
golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b/go.mod h1:4ZwOYna0/zsOKwuR5X/m0QFOJpSZvAxFfkQT+Erd9D4=
|
||||
golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
|
||||
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
|
||||
47
tracing/tracer.go
Normal file
47
tracing/tracer.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package tracing
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/spf13/viper"
|
||||
"github.com/uptrace/opentelemetry-go-extra/otelzap"
|
||||
"github.com/uptrace/uptrace-go/uptrace"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
var (
|
||||
Tracer trace.Tracer
|
||||
Logger *otelzap.Logger
|
||||
|
||||
version string = "v0.0.1"
|
||||
)
|
||||
|
||||
func InitTracer(appname string) {
|
||||
Tracer = otel.Tracer(appname)
|
||||
|
||||
var l *zap.Logger
|
||||
var err error
|
||||
if viper.GetBool("zap-production") {
|
||||
l, err = zap.NewProduction()
|
||||
} else {
|
||||
l, err = zap.NewDevelopment()
|
||||
}
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
Logger = otelzap.New(l)
|
||||
}
|
||||
|
||||
func InitUptrace(appname string) {
|
||||
uptrace.ConfigureOpentelemetry(
|
||||
uptrace.WithDSN(viper.GetString("uptrace-dsn")),
|
||||
uptrace.WithServiceName(appname),
|
||||
uptrace.WithServiceVersion(version),
|
||||
)
|
||||
}
|
||||
|
||||
func DeferUptrace(ctx context.Context) {
|
||||
uptrace.Shutdown(ctx)
|
||||
}
|
||||
Reference in New Issue
Block a user