| 
 | 1 | +package main  | 
 | 2 | + | 
 | 3 | +import (  | 
 | 4 | +	"time"  | 
 | 5 | + | 
 | 6 | +	"github.com/rs/zerolog/log"  | 
 | 7 | +	"go.opentelemetry.io/otel"  | 
 | 8 | +	"go.opentelemetry.io/otel/attribute"  | 
 | 9 | +	semconv "go.opentelemetry.io/otel/semconv/v1.27.0"  | 
 | 10 | +	"go.opentelemetry.io/otel/trace"  | 
 | 11 | +	"golang.org/x/sync/errgroup"  | 
 | 12 | + | 
 | 13 | +	"github.com/vodolaz095/pkg/stopper"  | 
 | 14 | +	"github.com/vodolaz095/pkg/tracing"  | 
 | 15 | +	"github.com/vodolaz095/pkg/zerologger"  | 
 | 16 | +)  | 
 | 17 | + | 
 | 18 | +func main() {  | 
 | 19 | +	initialCtx, cancel := stopper.New()  | 
 | 20 | +	defer cancel()  | 
 | 21 | + | 
 | 22 | +	// configure logging  | 
 | 23 | +	zerologger.Configure(zerologger.Log{Level: zerologger.TraceLevel})  | 
 | 24 | + | 
 | 25 | +	// configure tracing  | 
 | 26 | +	err := tracing.ConfigureUDP(tracing.UDPConfig{Ratio: 1},  | 
 | 27 | +		semconv.ServiceName("pkg_example"),  | 
 | 28 | +		attribute.String("environment", "example"),  | 
 | 29 | +	)  | 
 | 30 | +	if err != nil {  | 
 | 31 | +		log.Error().Err(err).Msgf("error setting tracing")  | 
 | 32 | +		return  | 
 | 33 | +	}  | 
 | 34 | + | 
 | 35 | +	eg, ctx := errgroup.WithContext(initialCtx)  | 
 | 36 | +	eg.Go(func() error {  | 
 | 37 | +		tt := time.NewTicker(time.Second)  | 
 | 38 | +		for {  | 
 | 39 | +			select {  | 
 | 40 | +			case <-ctx.Done():  | 
 | 41 | +				tt.Stop()  | 
 | 42 | +				log.Info().Msg("ticker 1 is stopping...")  | 
 | 43 | +				return nil  | 
 | 44 | +			case <-tt.C:  | 
 | 45 | +				log.Warn().Msg("Hello from ticker 1!")  | 
 | 46 | +			}  | 
 | 47 | +		}  | 
 | 48 | +	})  | 
 | 49 | + | 
 | 50 | +	eg.Go(func() error {  | 
 | 51 | +		time.Sleep(500 * time.Millisecond)  | 
 | 52 | +		tt := time.NewTicker(time.Second)  | 
 | 53 | +		for {  | 
 | 54 | +			select {  | 
 | 55 | +			case <-ctx.Done():  | 
 | 56 | +				tt.Stop()  | 
 | 57 | +				log.Info().Msg("ticker 2 is stopping...")  | 
 | 58 | +				return nil  | 
 | 59 | +			case <-tt.C:  | 
 | 60 | +				log.Info().Msg("Hello from ticker 2!")  | 
 | 61 | +			}  | 
 | 62 | +		}  | 
 | 63 | +	})  | 
 | 64 | + | 
 | 65 | +	eg.Go(func() error {  | 
 | 66 | +		tt := time.NewTicker(3 * time.Second)  | 
 | 67 | +		var n = 0  | 
 | 68 | +		for {  | 
 | 69 | +			select {  | 
 | 70 | +			case <-ctx.Done():  | 
 | 71 | +				tt.Stop()  | 
 | 72 | +				log.Info().Msg("ticker 3 is stopping...")  | 
 | 73 | +				return nil  | 
 | 74 | +			case <-tt.C:  | 
 | 75 | +				n += 1  | 
 | 76 | +				_, span := otel.Tracer("ticker").Start(ctx, "loop",  | 
 | 77 | +					trace.WithAttributes(attribute.Int("iteration", n)))  | 
 | 78 | +				span.AddEvent("Hello from ticker 3!", trace.WithAttributes(attribute.Int("iteration", n)))  | 
 | 79 | +				log.Info().  | 
 | 80 | +					Int("iteration", n).  | 
 | 81 | +					Str("trace_id", span.SpanContext().TraceID().String()).  | 
 | 82 | +					Msg("Hello from ticker 3!")  | 
 | 83 | +				span.End()  | 
 | 84 | +			}  | 
 | 85 | +		}  | 
 | 86 | +	})  | 
 | 87 | + | 
 | 88 | +	eg.Go(func() error {  | 
 | 89 | +		return tracing.Wait(ctx)  | 
 | 90 | +	})  | 
 | 91 | + | 
 | 92 | +	err = eg.Wait()  | 
 | 93 | +	if err != nil {  | 
 | 94 | +		log.Error().Err(err).Msgf("error starting application")  | 
 | 95 | +		return  | 
 | 96 | +	}  | 
 | 97 | +	log.Info().Msg("Application is stopped")  | 
 | 98 | +}  | 
0 commit comments