Skip to content

Commit

Permalink
Ability to specify uuid when capturing events (#68)
Browse files Browse the repository at this point in the history
* specify uuid

* tidy

* fix

* rename package

* rollback

* rollback all

* init

* fix changelog

* review fixes

---------

Co-authored-by: evgeny.iva <evgeny.iva@cadolabs.io>
  • Loading branch information
evgeek and evgeny.iva committed Aug 22, 2024
1 parent 1de931c commit 9e0199a
Show file tree
Hide file tree
Showing 13 changed files with 61 additions and 47 deletions.
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,18 @@ func main() {
Properties: posthog.NewProperties().
Set("$current_url", "https://example.com"),
})

// Capture event with calculated uuid to deduplicate repeated events.
// The library github.com/google/uuid is used
key := myEvent.Id + myEvent.Project
uid := uuid.NewSHA1(uuid.NameSpaceX500, []byte(key)).String()
client.Enqueue(posthog.Capture{
Uuid: uid,
DistinctId: "test-user",
Event: "$pageview",
Properties: posthog.NewProperties().
Set("$current_url", "https://example.com"),
})

// Check if a feature flag is enabled
isMyFlagEnabled, err := client.IsFeatureEnabled(
Expand Down
6 changes: 5 additions & 1 deletion capture.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ type Capture struct {
// This field is exported for serialization purposes and shouldn't be set by
// the application, its value is always overwritten by the library.
Type string

// You don't usually need to specify this field - Posthog will generate it automatically.
// Use it only when necessary - for example, to prevent duplicate events.
Uuid string
DistinctId string
Event string
Timestamp time.Time
Expand Down Expand Up @@ -44,6 +46,7 @@ func (msg Capture) Validate() error {

type CaptureInApi struct {
Type string `json:"type"`
Uuid string `json:"uuid"`
Library string `json:"library"`
LibraryVersion string `json:"library_version"`
Timestamp time.Time `json:"timestamp"`
Expand Down Expand Up @@ -72,6 +75,7 @@ func (msg Capture) APIfy() APIMessage {

apified := CaptureInApi{
Type: msg.Type,
Uuid: msg.Uuid,
Library: library,
LibraryVersion: libraryVersion,
Timestamp: msg.Timestamp,
Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ func main() {
os.Exit(1)
}

return nil
return nil
}

err := app.Run(os.Args)
Expand Down
19 changes: 0 additions & 19 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package posthog
import (
"net/http"
"time"

"github.com/google/uuid"
)

// Instances of this type carry the different configuration options that may
Expand Down Expand Up @@ -79,12 +77,6 @@ type Config struct {
// If not set the client will fallback to use a default retry policy.
RetryAfter func(int) time.Duration

// A function called by the client to generate unique message identifiers.
// The client uses a UUID generator if none is provided.
// This field is not exported and only exposed internally to let unit tests
// mock the id generation.
uid func() string

// A function called by the client to get the current time, `time.Now` is
// used by default.
// This field is not exported and only exposed internally to let unit tests
Expand Down Expand Up @@ -173,10 +165,6 @@ func makeConfig(c Config) Config {
c.RetryAfter = DefaultBacko().Duration
}

if c.uid == nil {
c.uid = uid
}

if c.now == nil {
c.now = time.Now
}
Expand All @@ -187,10 +175,3 @@ func makeConfig(c Config) Config {

return c
}

// This function returns a string representation of a UUID, it's the default
// function used for generating unique IDs.
func uid() string {
new_uuid, _ := uuid.NewRandom()
return new_uuid.String()
}
22 changes: 22 additions & 0 deletions fixtures/test-enqueue-capture-with-uuid.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"api_key": "Csyjlnlun3OzyNJAafdlv",
"batch": [
{
"distinct_id": "123456",
"event": "Download",
"library": "posthog-go",
"library_version": "1.0.0",
"properties": {
"$lib": "posthog-go",
"$lib_version": "1.0.0",
"application": "PostHog Go",
"platform": "macos",
"version": "1.0.0"
},
"send_feature_flags": false,
"timestamp": "2009-11-10T23:00:00Z",
"type": "capture",
"uuid": "11111111-1111-1111-1111-111111111111"
}
]
}
3 changes: 2 additions & 1 deletion fixtures/test-enqueue-capture.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
},
"send_feature_flags": false,
"timestamp": "2009-11-10T23:00:00Z",
"type": "capture"
"type": "capture",
"uuid": ""
}
]
}
3 changes: 2 additions & 1 deletion fixtures/test-interval-capture.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
},
"send_feature_flags": false,
"timestamp": "2009-11-10T23:00:00Z",
"type": "capture"
"type": "capture",
"uuid": ""
}
]
}
9 changes: 6 additions & 3 deletions fixtures/test-many-capture.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
},
"send_feature_flags": false,
"timestamp": "2009-11-10T23:00:00Z",
"type": "capture"
"type": "capture",
"uuid": ""
},
{
"distinct_id": "123456",
Expand All @@ -29,7 +30,8 @@
},
"send_feature_flags": false,
"timestamp": "2009-11-10T23:00:00Z",
"type": "capture"
"type": "capture",
"uuid": ""
},
{
"distinct_id": "123456",
Expand All @@ -44,7 +46,8 @@
},
"send_feature_flags": false,
"timestamp": "2009-11-10T23:00:00Z",
"type": "capture"
"type": "capture",
"uuid": ""
}
]
}
3 changes: 2 additions & 1 deletion fixtures/test-merge-capture.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
},
"send_feature_flags": false,
"timestamp": "2015-07-10T23:00:00Z",
"type": "capture"
"type": "capture",
"uuid": ""
}
]
}
3 changes: 2 additions & 1 deletion fixtures/test-timestamp-capture.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
},
"send_feature_flags": false,
"timestamp": "2015-07-10T23:00:00Z",
"type": "capture"
"type": "capture",
"uuid": ""
}
]
}
5 changes: 1 addition & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ module github.com/posthog/posthog-go

go 1.18

require (
github.com/google/uuid v1.3.0
github.com/urfave/cli v1.22.5
)
require github.com/urfave/cli v1.22.5

require (
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect
Expand Down
4 changes: 1 addition & 3 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
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/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
Expand All @@ -12,4 +10,4 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV
github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU=
github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
17 changes: 5 additions & 12 deletions posthog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,6 @@ func fixture(name string) string {
return string(b)
}

func mockId() string { return "I'm unique" }

func mockTime() time.Time {
// time.Unix(0, 0) fails on Circle
return time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
Expand Down Expand Up @@ -191,11 +189,11 @@ func ExampleCapture() {
Endpoint: server.URL,
BatchSize: 1,
now: mockTime,
uid: mockId,
})
defer client.Close()

client.Enqueue(Capture{
Uuid: "00000000-0000-0000-0000-000000000000",
Event: "Download",
DistinctId: "123456",
Properties: Properties{
Expand Down Expand Up @@ -225,7 +223,8 @@ func ExampleCapture() {
// },
// "send_feature_flags": false,
// "timestamp": "2009-11-10T23:00:00Z",
// "type": "capture"
// "type": "capture",
// "uuid": "00000000-0000-0000-0000-000000000000"
// }
// ]
// }
Expand All @@ -246,7 +245,6 @@ func TestCaptureNoProperties(t *testing.T) {
Endpoint: server.URL,
BatchSize: 1,
now: mockTime,
uid: mockId,
DefaultEventProperties: NewProperties().Set("service", "api"),
})
defer client.Close()
Expand Down Expand Up @@ -323,8 +321,9 @@ func TestEnqueue(t *testing.T) {
},

"*capture": {
strings.TrimSpace(fixture("test-enqueue-capture.json")),
strings.TrimSpace(fixture("test-enqueue-capture-with-uuid.json")),
&Capture{
Uuid: "11111111-1111-1111-1111-111111111111",
Event: "Download",
DistinctId: "123456",
Properties: Properties{
Expand All @@ -346,7 +345,6 @@ func TestEnqueue(t *testing.T) {
Logger: t,
BatchSize: 1,
now: mockTime,
uid: mockId,
})
defer client.Close()

Expand Down Expand Up @@ -404,7 +402,6 @@ func TestCaptureWithInterval(t *testing.T) {
Verbose: true,
Logger: t,
now: mockTime,
uid: mockId,
})
defer client.Close()

Expand Down Expand Up @@ -441,7 +438,6 @@ func TestCaptureWithTimestamp(t *testing.T) {
Logger: t,
BatchSize: 1,
now: mockTime,
uid: mockId,
})
defer client.Close()

Expand Down Expand Up @@ -475,7 +471,6 @@ func TestCaptureWithDefaultProperties(t *testing.T) {
Logger: t,
BatchSize: 1,
now: mockTime,
uid: mockId,
})
defer client.Close()

Expand Down Expand Up @@ -508,7 +503,6 @@ func TestCaptureMany(t *testing.T) {
Logger: t,
BatchSize: 3,
now: mockTime,
uid: mockId,
})
defer client.Close()

Expand Down Expand Up @@ -1711,7 +1705,6 @@ func TestCaptureSendFlags(t *testing.T) {
Logger: t,
BatchSize: 1,
now: mockTime,
uid: mockId,

PersonalApiKey: "some very secret key",
})
Expand Down

0 comments on commit 9e0199a

Please sign in to comment.