-
Notifications
You must be signed in to change notification settings - Fork 2.4k
fix(redisotel): fix the situation of reporting spans multiple times #3168
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
flc1125
commented
Oct 23, 2024

Hello, @flc1125, thanks for contributing. Would you mind describing the issue that you are trying to fix in more details:
And please add some tests if possible. |
OK, I am on vacation, I will deal with this issue when I have free time. |
Additionally, as a supplementary inquiry, I would like to understand the following information:
|
I am on the same boat as you and still trying to figure out if we have any blockers to upgrade to a newer Go version. I do think @monkey92t or @vmihailenco can share if they need this library to keep 1.18 as a minimum go version.
No need to add another assert library, we do use a fork of https://onsi.github.io/gomega/ and I hope to soon actually have the official https://onsi.github.io/gomega/ . Both questions are kind of related, if we are fine to update the go version we may try to move to the official https://onsi.github.io/gomega/ and https://onsi.github.io/ginkgo/ libraries. |
I still don't understand how and why this issue occurred. Does removing the hooks break anything else or is it a safe fix. Again, maybe @monkey92t has more experience with the otel codebaase in go-redis. |
That's not the case, it's just an additional optimization. You can ignore this issue. 😄 |
In the cluster architecture, when a Redis command is initiated, it will generate two spans of the link due to the repeated Hook. But I think one span should be enough actually.
I think I can't answer this question, maybe need to consult the author at that time. This is an early PR: #2244 @vmihailenco Please help, and see if you can answer this question.
Since it cancelled a link, it is a disruptive change. But I think it might be a defect rather than a function. It should be fixed. After the above conclusions are drawn, I will combine the results to conduct supplementary tests. |
Is there any latest news? Can I just add unit tests according to my current implementation? |
There don't seem to be any issues preventing the Go version upgrade. It currently remains at Go 1.18, likely just due to a lack of maintenance.
I don't seem to see any unnecessary hooks in the PR. |
When I initiate a command like |
An example: package go_redis_otel
import (
"context"
"testing"
"github.com/redis/go-redis/extra/redisotel/v9"
"github.com/redis/go-redis/v9"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/sdk/trace/tracetest"
)
var ctx = context.Background()
func TestRedis(t *testing.T) {
client := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{"localhost:7000", "localhost:7001", "localhost:7002"},
})
imsb := tracetest.NewInMemoryExporter()
provider := trace.NewTracerProvider(trace.WithSyncer(imsb))
require.NoError(t, redisotel.InstrumentTracing(client, redisotel.WithTracerProvider(provider)))
cmd := client.Ping(ctx)
require.NoError(t, cmd.Err())
spans := imsb.GetSpans()
pingCount := 0
for _, span := range spans {
t.Logf("Span: Name: %s, SpanKind: %v, TraceID: %s, SpanID: %s, ParentSpanID: %s \n",
span.Name, span.SpanKind, span.SpanContext.TraceID().String(), span.SpanContext.SpanID().String(), span.Parent.SpanID().String())
if span.Name == "ping" {
pingCount++
}
}
assert.Equal(t, 2, pingCount, "expected 2 ping spans")
} output:
Among them, |
It looks correct. We have already added a hook for each newly created node in OnNewNode. We should remove the redundant hooks. Good! |
ClusterClient contains multiple Client instances and has a global hook that is executed for any command. Each Client also has its own hook, but in Cluster mode, the hook is only executed when the command is routed to the corresponding Client node. The ClusterClient hook is indeed redundant, and we should remove it. cc @ndyakov Please approve this PR, it requires permission. |
If the function meets expectations, I will improve the unit test before entering the review stage. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@monkey92t approved
@flc1125 Do you need to add more tests? I won’t specifically require tests for tracing since it’s not a core feature of go-redis. If you don’t need to add more tests, we can finalize the PR and proceed with the merge. |
I will add that if it is necessary to expedite the merge process, this merge can be carried out. I can submit another PR later for additional updates. PS: I have been quite busy recently, so the progress might be affected. |
Alright, you can add some tests when you have time. Thanks for your PR! |
@ndyakov Can this be merged? |
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | require | minor | `v9.7.3` -> `v9.8.0` | --- ### Release Notes <details> <summary>redis/go-redis (github.com/redis/go-redis/v9)</summary> ### [`v9.8.0`](https://github.com/redis/go-redis/releases/tag/v9.8.0) [Compare Source](redis/go-redis@v9.7.3...v9.8.0) ### 9.8.0 (2025-04-30) #### 🚀 Highlights - **Redis 8 Support**: Full compatibility with Redis 8.0, including testing and CI integration - **Enhanced Hash Operations**: Added support for new hash commands (`HGETDEL`, `HGETEX`, `HSETEX`) and `HSTRLEN` command - **Search Improvements**: Enabled Search DIALECT 2 by default and added `CountOnly` argument for `FT.Search` #### ✨ New Features - Added support for new hash commands: `HGETDEL`, `HGETEX`, `HSETEX` ([#​3305](redis/go-redis#3305)) - Added `HSTRLEN` command for hash operations ([#​2843](redis/go-redis#2843)) - Added `Do` method for raw query by single connection from `pool.Conn()` ([#​3182](redis/go-redis#3182)) - Prevent false-positive marshaling by treating zero time.Time as empty in isEmptyValue ([#​3273](redis/go-redis#3273)) - Added FailoverClusterClient support for Universal client ([#​2794](redis/go-redis#2794)) - Added support for cluster mode with `IsClusterMode` config parameter ([#​3255](redis/go-redis#3255)) - Added client name support in `HELLO` RESP handshake ([#​3294](redis/go-redis#3294)) - **Enabled Search DIALECT 2 by default** ([#​3213](redis/go-redis#3213)) - Added read-only option for failover configurations ([#​3281](redis/go-redis#3281)) - Added `CountOnly` argument for `FT.Search` to use `LIMIT 0 0` ([#​3338](redis/go-redis#3338)) - Added `DB` option support in `NewFailoverClusterClient` ([#​3342](redis/go-redis#3342)) - Added `nil` check for the options when creating a client ([#​3363](redis/go-redis#3363)) #### 🐛 Bug Fixes - Fixed `PubSub` concurrency safety issues ([#​3360](redis/go-redis#3360)) - Fixed panic caused when argument is `nil` ([#​3353](redis/go-redis#3353)) - Improved error handling when fetching master node from sentinels ([#​3349](redis/go-redis#3349)) - Fixed connection pool timeout issues and increased retries ([#​3298](redis/go-redis#3298)) - Fixed context cancellation error leading to connection spikes on Primary instances ([#​3190](redis/go-redis#3190)) - Fixed RedisCluster client to consider `MASTERDOWN` a retriable error ([#​3164](redis/go-redis#3164)) - Fixed tracing to show complete commands instead of truncated versions ([#​3290](redis/go-redis#3290)) - Fixed OpenTelemetry instrumentation to prevent multiple span reporting ([#​3168](redis/go-redis#3168)) - Fixed `FT.Search` Limit argument and added `CountOnly` argument for limit 0 0 ([#​3338](redis/go-redis#3338)) - Fixed missing command in interface ([#​3344](redis/go-redis#3344)) - Fixed slot calculation for `COUNTKEYSINSLOT` command ([#​3327](redis/go-redis#3327)) - Updated PubSub implementation with correct context ([#​3329](redis/go-redis#3329)) #### 📚 Documentation - Added hash search examples ([#​3357](redis/go-redis#3357)) - Fixed documentation comments ([#​3351](redis/go-redis#3351)) - Added `CountOnly` search example ([#​3345](redis/go-redis#3345)) - Added examples for list commands: `LLEN`, `LPOP`, `LPUSH`, `LRANGE`, `RPOP`, `RPUSH` ([#​3234](redis/go-redis#3234)) - Added `SADD` and `SMEMBERS` command examples ([#​3242](redis/go-redis#3242)) - Updated `README.md` to use Redis Discord guild ([#​3331](redis/go-redis#3331)) - Updated `HExpire` command documentation ([#​3355](redis/go-redis#3355)) - Featured OpenTelemetry instrumentation more prominently ([#​3316](redis/go-redis#3316)) - Updated `README.md` with additional information ([#​310ce55](redis/go-redis@310ce55)) #### ⚡ Performance and Reliability - Bound connection pool background dials to configured dial timeout ([#​3089](redis/go-redis#3089)) - Ensured context isn't exhausted via concurrent query ([#​3334](redis/go-redis#3334)) #### 🔧 Dependencies and Infrastructure - Updated testing image to Redis 8.0-RC2 ([#​3361](redis/go-redis#3361)) - Enabled CI for Redis CE 8.0 ([#​3274](redis/go-redis#3274)) - Updated various dependencies: - Bumped golangci/golangci-lint-action from 6.5.0 to 7.0.0 ([#​3354](redis/go-redis#3354)) - Bumped rojopolis/spellcheck-github-actions ([#​3336](redis/go-redis#3336)) - Bumped golang.org/x/net in example/otel ([#​3308](redis/go-redis#3308)) - Migrated golangci-lint configuration to v2 format ([#​3354](redis/go-redis#3354)) ####⚠️ Breaking Changes - **Enabled Search DIALECT 2 by default** ([#​3213](redis/go-redis#3213)) - Dropped RedisGears (Triggers and Functions) support ([#​3321](redis/go-redis#3321)) - Dropped FT.PROFILE command that was never enabled ([#​3323](redis/go-redis#3323)) #### 🔒 Security - Fixed network error handling on SETINFO (CVE-2025-29923) ([#​3295](redis/go-redis#3295)) #### 🧪 Testing - Added integration tests for Redis 8 behavior changes in Redis Search ([#​3337](redis/go-redis#3337)) - Added vector types INT8 and UINT8 tests ([#​3299](redis/go-redis#3299)) - Added test codes for search_commands.go ([#​3285](redis/go-redis#3285)) - Fixed example test sorting ([#​3292](redis/go-redis#3292)) #### 👥 Contributors We would like to thank all the contributors who made this release possible: [@​alexander-menshchikov](https://github.com/alexander-menshchikov), [@​EXPEbdodla](https://github.com/EXPEbdodla), [@​afti](https://github.com/afti), [@​dmaier-redislabs](https://github.com/dmaier-redislabs), [@​four_leaf_clover](https://github.com/four_leaf_clover), [@​alohaglenn](https://github.com/alohaglenn), [@​gh73962](https://github.com/gh73962), [@​justinmir](https://github.com/justinmir), [@​LINKIWI](https://github.com/LINKIWI), [@​liushuangbill](https://github.com/liushuangbill), [@​golang88](https://github.com/golang88), [@​gnpaone](https://github.com/gnpaone), [@​ndyakov](https://github.com/ndyakov), [@​nikolaydubina](https://github.com/nikolaydubina), [@​oleglacto](https://github.com/oleglacto), [@​andy-stark-redis](https://github.com/andy-stark-redis), [@​rodneyosodo](https://github.com/rodneyosodo), [@​dependabot](https://github.com/dependabot), [@​rfyiamcool](https://github.com/rfyiamcool), [@​frankxjkuang](https://github.com/frankxjkuang), [@​fukua95](https://github.com/fukua95), [@​soleymani-milad](https://github.com/soleymani-milad), [@​ofekshenawa](https://github.com/ofekshenawa), [@​khasanovbi](https://github.com/khasanovbi) </details> --- ### Configuration 📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC), Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) (UTC). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4yNjEuNCIsInVwZGF0ZWRJblZlciI6IjM5LjI2MS40IiwidGFyZ2V0QnJhbmNoIjoiZm9yZ2VqbyIsImxhYmVscyI6WyJkZXBlbmRlbmN5LXVwZ3JhZGUiLCJ0ZXN0L25vdC1uZWVkZWQiXX0=--> Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7739 Reviewed-by: Earl Warren <[email protected]> Co-authored-by: Renovate Bot <[email protected]> Co-committed-by: Renovate Bot <[email protected]>