func (h *Stats) TagRPC(ctx context.Context, _ *stats.RPCTagInfo) context.Context {
return ctx
}
func (h *Stats) HandleRPC(ctx context.Context, s stats.RPCStats) {
if trailer, ok := s.(*stats.OutTrailer); ok {
remoteAddr := string(stats.Tags(ctx))
connInfoInterface, ok := h.connInfo.Load(remoteAddr)
if !ok {
h.logger.Warn(ctx, "start time was not set")
return
}
connInfo := connInfoInterface.(*connInfo)
connInfo.label = trailer.Trailer.Get(remoteAddr)[0]
}
}
func (h *Stats) TagConn(ctx context.Context, s *stats.ConnTagInfo) context.Context {
ctx = stats.SetIncomingTags(ctx, []byte(s.RemoteAddr.String()))
return ctx
}
func (h *Stats) HandleConn(ctx context.Context, s stats.ConnStats) {
remoteAddr := string(stats.Tags(ctx))
switch s.(type) {
case *stats.ConnBegin:
h.connInfo.Store(remoteAddr, &connInfo{beginTime: time.Now()})
case *stats.ConnEnd:
connInfoInterface, ok := h.connInfo.LoadAndDelete(remoteAddr)
if !ok {
h.logger.Warn(ctx, "begin time was not set")
}
connInfo, ok := connInfoInterface.(*connInfo)
if !ok {
h.logger.Warn(ctx, "wrong convertations")
}
h.metrics.ConnectionTime.With(metrics.MakeLabels(connInfo.label)).Observe(time.Since(connInfo.beginTime).Seconds())
}
}
Условно, "testName" - "{"year":"1990",...}"
Не нужно ничего искать, просто взять по ключу из бд. Ее заполнением не нужно заниматься.
По сути это не бот, а просто клиент к бд. Там выйдет работы на 50 строк.
Просто это настолько простая задача, что я подумал может даже эти 50 строк не надо писать, а просто склонить репу и завести, поправив что-то в конфиге. Если такого нет, то окей, никаких проблем.