diff --git a/CHANGELOG.md b/CHANGELOG.md index 341714c..655c995 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +## 1.7.0 + +**Breaking Changes:** +* `ExceptionInApi.Properties` type changed from `ExceptionInApiProperties` (struct) to `Properties` (map[string]interface{}) +* Removed `ExceptionInApiProperties` struct, replaced with `Properties` map for custom properties. +* Note: All existing system properties (`$lib`, `$lib_version`, `distinct_id`, `$exception_list`, etc.) are still attached and sent to the API, only the type representation has changed. + +**Features:** +* feat: Add custom properties support to exceptions + - Exceptions now support custom properties via the `Properties` field + - Added `Exception.WithProperties()` builder method to add properties to exceptions + - Added `WithPropertiesFn` option for slog handler to extract log attributes as exception properties + - Custom properties can override system properties + +* [Full Changelog](https://github.com/PostHog/posthog-go/compare/v1.6.12...v1.7.0) + ## 1.6.12 * [Full Changelog](https://github.com/PostHog/posthog-go/compare/v1.6.11...v1.6.12) diff --git a/README.md b/README.md index f2e71d3..8f5c73b 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,31 @@ func main() { "Error Description", )) + // Capture an exception with custom properties + client.Enqueue(posthog.NewDefaultException( + time.Now(), + "distinct-id", + "Error title", + "Error Description", + ).WithProperties(posthog.NewProperties(). + Set("custom_property_a", "custom_value_a"). + Set("custom_property_b", "custom_value_b"), + )) + + // Or use the Exception struct directly for full control + client.Enqueue(posthog.Exception{ + DistinctId: "distinct-id", + Properties: posthog.NewProperties(). + Set("custom_property_a", "custom_value_a"). + Set("custom_property_b", "custom_value_b"), + ExceptionList: []posthog.ExceptionItem{ + { + Type: "Error title", + Value: "Error description", + }, + }, + }) + // Create a logger which automatically captures warning logs and above baseLogHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}) logger := slog.New(posthog.NewSlogCaptureHandler(baseLogHandler, client, @@ -86,7 +111,21 @@ func main() { }), }) logger.Warn("Log that something broke", "error", fmt.Errorf("this is a dummy scenario")) - + + // Optionally extract custom properties from slog attributes + loggerWithProps := slog.New(posthog.NewSlogCaptureHandler(baseLogHandler, client, + posthog.WithPropertiesFn(func(ctx context.Context, r slog.Record) posthog.Properties { + props := posthog.NewProperties() + r.Attrs(func(a slog.Attr) bool { + props.Set(a.Key, a.Value.Any()) + return true + }) + return props + }), + )) + loggerWithProps.Error("Payment failed", "payment_id", "pay_123", "amount", 99.99) + // This exception will have custom properties: payment_id and amount + // Capture event with calculated uuid to deduplicate repeated events. // The library github.com/google/uuid is used key := myEvent.Id + myEvent.Project diff --git a/coverage.out b/coverage.out new file mode 100644 index 0000000..11ca70e --- /dev/null +++ b/coverage.out @@ -0,0 +1,856 @@ +mode: set +github.com/posthog/posthog-go/alias.go:19.29,20.27 1 0 +github.com/posthog/posthog-go/alias.go:23.35,24.30 1 1 +github.com/posthog/posthog-go/alias.go:24.30,30.3 1 1 +github.com/posthog/posthog-go/alias.go:32.2,32.25 1 1 +github.com/posthog/posthog-go/alias.go:32.25,38.3 1 1 +github.com/posthog/posthog-go/alias.go:40.2,40.12 1 1 +github.com/posthog/posthog-go/alias.go:62.37,81.2 3 1 +github.com/posthog/posthog-go/backo.go:17.91,19.2 1 1 +github.com/posthog/posthog-go/backo.go:27.28,29.2 1 1 +github.com/posthog/posthog-go/backo.go:32.57,35.23 2 1 +github.com/posthog/posthog-go/backo.go:35.23,38.44 3 0 +github.com/posthog/posthog-go/backo.go:38.44,40.4 1 0 +github.com/posthog/posthog-go/backo.go:40.9,42.4 1 0 +github.com/posthog/posthog-go/backo.go:45.2,46.32 2 1 +github.com/posthog/posthog-go/backo.go:50.40,53.2 2 0 +github.com/posthog/posthog-go/backo.go:60.37,67.12 3 0 +github.com/posthog/posthog-go/backo.go:67.12,68.21 1 0 +github.com/posthog/posthog-go/backo.go:68.21,69.11 1 0 +github.com/posthog/posthog-go/backo.go:70.42,71.11 1 0 +github.com/posthog/posthog-go/backo.go:72.23,74.11 2 0 +github.com/posthog/posthog-go/backo.go:79.2,79.15 1 0 +github.com/posthog/posthog-go/backo.go:82.25,84.2 1 0 +github.com/posthog/posthog-go/capture.go:22.56,24.2 1 1 +github.com/posthog/posthog-go/capture.go:26.76,28.2 1 1 +github.com/posthog/posthog-go/capture.go:34.49,36.2 1 1 +github.com/posthog/posthog-go/capture.go:38.69,40.2 1 1 +github.com/posthog/posthog-go/capture.go:43.59,45.2 1 1 +github.com/posthog/posthog-go/capture.go:47.87,49.2 1 0 +github.com/posthog/posthog-go/capture.go:52.49,53.31 1 1 +github.com/posthog/posthog-go/capture.go:53.31,55.3 1 1 +github.com/posthog/posthog-go/capture.go:56.2,56.40 1 1 +github.com/posthog/posthog-go/capture.go:59.69,60.31 1 1 +github.com/posthog/posthog-go/capture.go:60.31,62.3 1 1 +github.com/posthog/posthog-go/capture.go:63.2,63.40 1 1 +github.com/posthog/posthog-go/capture.go:84.31,85.27 1 0 +github.com/posthog/posthog-go/capture.go:88.37,89.25 1 1 +github.com/posthog/posthog-go/capture.go:89.25,95.3 1 1 +github.com/posthog/posthog-go/capture.go:97.2,97.30 1 1 +github.com/posthog/posthog-go/capture.go:97.30,103.3 1 1 +github.com/posthog/posthog-go/capture.go:105.2,105.12 1 1 +github.com/posthog/posthog-go/capture.go:121.39,126.27 3 1 +github.com/posthog/posthog-go/capture.go:126.27,127.36 1 1 +github.com/posthog/posthog-go/capture.go:127.36,129.4 1 1 +github.com/posthog/posthog-go/capture.go:132.2,132.23 1 1 +github.com/posthog/posthog-go/capture.go:132.23,134.3 1 1 +github.com/posthog/posthog-go/capture.go:136.2,148.16 2 1 +github.com/posthog/posthog-go/config.go:101.40,103.2 1 1 +github.com/posthog/posthog-go/config.go:129.35,130.20 1 1 +github.com/posthog/posthog-go/config.go:130.20,136.3 1 1 +github.com/posthog/posthog-go/config.go:138.2,138.21 1 1 +github.com/posthog/posthog-go/config.go:138.21,144.3 1 1 +github.com/posthog/posthog-go/config.go:146.2,146.49 1 1 +github.com/posthog/posthog-go/config.go:146.49,152.3 1 1 +github.com/posthog/posthog-go/config.go:154.2,154.12 1 1 +github.com/posthog/posthog-go/config.go:159.34,160.26 1 1 +github.com/posthog/posthog-go/config.go:160.26,162.3 1 1 +github.com/posthog/posthog-go/config.go:164.2,164.21 1 1 +github.com/posthog/posthog-go/config.go:164.21,166.3 1 1 +github.com/posthog/posthog-go/config.go:168.2,168.47 1 1 +github.com/posthog/posthog-go/config.go:168.47,170.3 1 1 +github.com/posthog/posthog-go/config.go:172.2,172.38 1 1 +github.com/posthog/posthog-go/config.go:172.38,174.3 1 1 +github.com/posthog/posthog-go/config.go:176.2,176.24 1 1 +github.com/posthog/posthog-go/config.go:176.24,178.3 1 1 +github.com/posthog/posthog-go/config.go:180.2,180.21 1 1 +github.com/posthog/posthog-go/config.go:180.21,182.3 1 1 +github.com/posthog/posthog-go/config.go:184.2,184.22 1 1 +github.com/posthog/posthog-go/config.go:184.22,186.3 1 1 +github.com/posthog/posthog-go/config.go:188.2,188.25 1 1 +github.com/posthog/posthog-go/config.go:188.25,190.3 1 1 +github.com/posthog/posthog-go/config.go:192.2,192.18 1 1 +github.com/posthog/posthog-go/config.go:192.18,194.3 1 1 +github.com/posthog/posthog-go/config.go:196.2,196.34 1 1 +github.com/posthog/posthog-go/config.go:196.34,198.3 1 1 +github.com/posthog/posthog-go/config.go:200.2,200.25 1 1 +github.com/posthog/posthog-go/config.go:200.25,201.38 1 1 +github.com/posthog/posthog-go/config.go:201.38,203.4 1 1 +github.com/posthog/posthog-go/config.go:204.3,204.59 1 1 +github.com/posthog/posthog-go/config.go:207.2,207.10 1 1 +github.com/posthog/posthog-go/error.go:23.37,25.2 1 1 +github.com/posthog/posthog-go/error.go:43.36,45.2 1 1 +github.com/posthog/posthog-go/error_tracking.go:63.33,63.60 1 0 +github.com/posthog/posthog-go/error_tracking.go:65.39,66.30 1 1 +github.com/posthog/posthog-go/error_tracking.go:66.30,72.3 1 1 +github.com/posthog/posthog-go/error_tracking.go:73.2,73.33 1 1 +github.com/posthog/posthog-go/error_tracking.go:73.33,79.3 1 1 +github.com/posthog/posthog-go/error_tracking.go:80.2,80.41 1 1 +github.com/posthog/posthog-go/error_tracking.go:80.41,81.41 1 1 +github.com/posthog/posthog-go/error_tracking.go:81.41,83.4 1 1 +github.com/posthog/posthog-go/error_tracking.go:86.2,86.12 1 1 +github.com/posthog/posthog-go/error_tracking.go:89.43,90.20 1 1 +github.com/posthog/posthog-go/error_tracking.go:90.20,96.3 1 1 +github.com/posthog/posthog-go/error_tracking.go:97.2,97.21 1 1 +github.com/posthog/posthog-go/error_tracking.go:97.21,103.3 1 1 +github.com/posthog/posthog-go/error_tracking.go:105.2,105.12 1 1 +github.com/posthog/posthog-go/error_tracking.go:108.41,117.22 3 1 +github.com/posthog/posthog-go/error_tracking.go:117.22,119.3 1 1 +github.com/posthog/posthog-go/error_tracking.go:121.2,121.37 1 1 +github.com/posthog/posthog-go/error_tracking.go:121.37,123.3 1 1 +github.com/posthog/posthog-go/error_tracking.go:125.2,125.27 1 1 +github.com/posthog/posthog-go/error_tracking.go:125.27,126.36 1 1 +github.com/posthog/posthog-go/error_tracking.go:126.36,128.4 1 1 +github.com/posthog/posthog-go/error_tracking.go:131.2,138.3 1 1 +github.com/posthog/posthog-go/error_tracking.go:148.13,163.25 3 1 +github.com/posthog/posthog-go/error_tracking.go:163.25,165.3 1 1 +github.com/posthog/posthog-go/error_tracking.go:167.2,167.18 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:28.109,30.27 2 1 +github.com/posthog/posthog-go/error_tracking_slog.go:30.27,32.3 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:33.2,33.66 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:36.82,38.36 1 0 +github.com/posthog/posthog-go/error_tracking_slog.go:38.36,40.3 1 0 +github.com/posthog/posthog-go/error_tracking_slog.go:42.2,42.35 1 0 +github.com/posthog/posthog-go/error_tracking_slog.go:45.79,48.34 2 1 +github.com/posthog/posthog-go/error_tracking_slog.go:48.34,50.3 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:53.2,53.56 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:53.56,55.3 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:56.2,57.22 2 1 +github.com/posthog/posthog-go/error_tracking_slog.go:57.22,59.3 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:61.2,76.12 3 1 +github.com/posthog/posthog-go/error_tracking_slog.go:79.72,85.2 1 0 +github.com/posthog/posthog-go/error_tracking_slog.go:87.66,93.2 1 0 +github.com/posthog/posthog-go/error_tracking_slog.go:115.66,119.32 3 1 +github.com/posthog/posthog-go/error_tracking_slog.go:119.32,121.3 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:123.2,123.33 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:123.33,124.43 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:124.43,125.42 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:125.42,126.49 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:126.49,129.6 2 1 +github.com/posthog/posthog-go/error_tracking_slog.go:132.3,132.14 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:134.2,134.18 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:134.18,136.3 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:138.2,138.19 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:141.60,142.18 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:143.20,145.17 2 1 +github.com/posthog/posthog-go/error_tracking_slog.go:145.17,147.4 1 0 +github.com/posthog/posthog-go/error_tracking_slog.go:149.3,149.47 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:149.47,151.4 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:153.3,154.37 2 0 +github.com/posthog/posthog-go/error_tracking_slog.go:154.37,155.37 1 0 +github.com/posthog/posthog-go/error_tracking_slog.go:155.37,157.5 1 0 +github.com/posthog/posthog-go/error_tracking_slog.go:160.3,160.13 1 0 +github.com/posthog/posthog-go/error_tracking_slog.go:161.22,162.32 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:162.32,163.53 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:163.53,165.5 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:168.3,168.13 1 0 +github.com/posthog/posthog-go/error_tracking_slog.go:169.26,170.39 1 1 +github.com/posthog/posthog-go/error_tracking_slog.go:171.10,172.13 1 1 +github.com/posthog/posthog-go/error_tracking_slog_options.go:45.43,48.63 1 1 +github.com/posthog/posthog-go/error_tracking_slog_options.go:48.63,50.4 1 0 +github.com/posthog/posthog-go/error_tracking_slog_options.go:51.65,53.4 1 1 +github.com/posthog/posthog-go/error_tracking_slog_options.go:62.67,64.4 1 1 +github.com/posthog/posthog-go/error_tracking_slog_options.go:70.51,71.32 1 1 +github.com/posthog/posthog-go/error_tracking_slog_options.go:71.32,71.57 1 1 +github.com/posthog/posthog-go/error_tracking_slog_options.go:74.86,75.32 1 1 +github.com/posthog/posthog-go/error_tracking_slog_options.go:75.32,75.53 1 1 +github.com/posthog/posthog-go/error_tracking_slog_options.go:78.88,79.32 1 0 +github.com/posthog/posthog-go/error_tracking_slog_options.go:79.32,79.54 1 0 +github.com/posthog/posthog-go/error_tracking_slog_options.go:82.33,83.32 1 0 +github.com/posthog/posthog-go/error_tracking_slog_options.go:83.32,84.12 1 0 +github.com/posthog/posthog-go/error_tracking_slog_options.go:84.12,86.4 1 0 +github.com/posthog/posthog-go/error_tracking_slog_options.go:90.72,91.32 1 0 +github.com/posthog/posthog-go/error_tracking_slog_options.go:91.32,91.69 1 0 +github.com/posthog/posthog-go/error_tracking_slog_options.go:94.74,95.32 1 0 +github.com/posthog/posthog-go/error_tracking_slog_options.go:95.32,95.70 1 0 +github.com/posthog/posthog-go/error_tracking_slog_options.go:100.90,101.32 1 1 +github.com/posthog/posthog-go/error_tracking_slog_options.go:101.32,101.53 1 1 +github.com/posthog/posthog-go/error_tracking_stack_trace.go:18.51,24.66 3 1 +github.com/posthog/posthog-go/error_tracking_stack_trace.go:24.66,26.3 1 1 +github.com/posthog/posthog-go/error_tracking_stack_trace.go:28.2,28.13 1 1 +github.com/posthog/posthog-go/error_tracking_stack_trace.go:50.82,56.6 5 1 +github.com/posthog/posthog-go/error_tracking_stack_trace.go:56.6,58.35 2 1 +github.com/posthog/posthog-go/error_tracking_stack_trace.go:58.35,59.9 1 1 +github.com/posthog/posthog-go/error_tracking_stack_trace.go:62.3,70.15 2 1 +github.com/posthog/posthog-go/error_tracking_stack_trace.go:70.15,71.9 1 1 +github.com/posthog/posthog-go/error_tracking_stack_trace.go:75.2,78.3 1 1 +github.com/posthog/posthog-go/executor.go:11.37,17.2 2 1 +github.com/posthog/posthog-go/executor.go:19.41,23.34 3 1 +github.com/posthog/posthog-go/executor.go:23.34,25.3 1 1 +github.com/posthog/posthog-go/executor.go:27.2,28.12 2 1 +github.com/posthog/posthog-go/executor.go:28.12,29.16 1 1 +github.com/posthog/posthog-go/executor.go:29.16,33.4 3 1 +github.com/posthog/posthog-go/executor.go:34.3,34.9 1 1 +github.com/posthog/posthog-go/executor.go:36.2,36.13 1 1 +github.com/posthog/posthog-go/executor.go:39.28,43.2 3 1 +github.com/posthog/posthog-go/feature_flag_config.go:13.47,14.21 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:14.21,20.3 1 0 +github.com/posthog/posthog-go/feature_flag_config.go:22.2,22.28 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:22.28,28.3 1 0 +github.com/posthog/posthog-go/feature_flag_config.go:30.2,30.21 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:30.21,32.3 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:34.2,34.31 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:34.31,36.3 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:38.2,38.30 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:38.30,40.3 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:42.2,42.36 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:42.36,45.3 2 1 +github.com/posthog/posthog-go/feature_flag_config.go:46.2,46.12 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:58.52,59.28 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:59.28,65.3 1 0 +github.com/posthog/posthog-go/feature_flag_config.go:67.2,67.21 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:67.21,69.3 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:71.2,71.31 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:71.31,73.3 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:75.2,75.30 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:75.30,77.3 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:79.2,79.36 1 1 +github.com/posthog/posthog-go/feature_flag_config.go:79.36,82.3 2 1 +github.com/posthog/posthog-go/feature_flag_config.go:83.2,83.12 1 1 +github.com/posthog/posthog-go/featureflags.go:120.49,122.2 1 1 +github.com/posthog/posthog-go/featureflags.go:132.56,134.2 1 1 +github.com/posthog/posthog-go/featureflags.go:144.17,146.27 1 1 +github.com/posthog/posthog-go/featureflags.go:146.27,150.3 1 0 +github.com/posthog/posthog-go/featureflags.go:152.2,152.46 1 1 +github.com/posthog/posthog-go/featureflags.go:152.46,156.3 1 0 +github.com/posthog/posthog-go/featureflags.go:158.2,158.49 1 1 +github.com/posthog/posthog-go/featureflags.go:158.49,163.3 1 0 +github.com/posthog/posthog-go/featureflags.go:166.2,166.37 1 1 +github.com/posthog/posthog-go/featureflags.go:166.37,171.3 1 1 +github.com/posthog/posthog-go/featureflags.go:173.2,176.31 2 1 +github.com/posthog/posthog-go/featureflags.go:176.31,177.27 1 1 +github.com/posthog/posthog-go/featureflags.go:177.27,179.4 1 1 +github.com/posthog/posthog-go/featureflags.go:180.3,182.4 1 1 +github.com/posthog/posthog-go/featureflags.go:186.2,186.45 1 1 +github.com/posthog/posthog-go/featureflags.go:186.45,187.55 1 1 +github.com/posthog/posthog-go/featureflags.go:187.55,188.12 1 1 +github.com/posthog/posthog-go/featureflags.go:192.3,193.18 2 1 +github.com/posthog/posthog-go/featureflags.go:193.18,199.4 2 1 +github.com/posthog/posthog-go/featureflags.go:202.3,202.22 1 1 +github.com/posthog/posthog-go/featureflags.go:202.22,204.4 1 0 +github.com/posthog/posthog-go/featureflags.go:204.9,207.18 2 1 +github.com/posthog/posthog-go/featureflags.go:207.18,213.5 2 0 +github.com/posthog/posthog-go/featureflags.go:214.4,214.40 1 1 +github.com/posthog/posthog-go/featureflags.go:219.2,219.90 1 1 +github.com/posthog/posthog-go/featureflags.go:219.90,221.17 2 1 +github.com/posthog/posthog-go/featureflags.go:221.17,223.4 1 0 +github.com/posthog/posthog-go/featureflags.go:224.3,224.20 1 1 +github.com/posthog/posthog-go/featureflags.go:228.2,230.3 1 0 +github.com/posthog/posthog-go/featureflags.go:234.98,236.70 1 1 +github.com/posthog/posthog-go/featureflags.go:236.70,237.51 1 1 +github.com/posthog/posthog-go/featureflags.go:237.51,240.4 1 1 +github.com/posthog/posthog-go/featureflags.go:240.9,240.59 1 1 +github.com/posthog/posthog-go/featureflags.go:240.59,243.4 1 1 +github.com/posthog/posthog-go/featureflags.go:243.9,245.4 1 1 +github.com/posthog/posthog-go/featureflags.go:249.2,249.47 1 1 +github.com/posthog/posthog-go/featureflags.go:249.47,250.51 1 1 +github.com/posthog/posthog-go/featureflags.go:250.51,252.4 1 1 +github.com/posthog/posthog-go/featureflags.go:256.2,256.19 1 1 +github.com/posthog/posthog-go/featureflags.go:270.32,273.16 3 1 +github.com/posthog/posthog-go/featureflags.go:273.16,275.3 1 0 +github.com/posthog/posthog-go/featureflags.go:277.2,277.25 1 1 +github.com/posthog/posthog-go/featureflags.go:277.25,278.39 1 1 +github.com/posthog/posthog-go/featureflags.go:278.39,278.65 1 1 +github.com/posthog/posthog-go/featureflags.go:281.2,299.21 3 1 +github.com/posthog/posthog-go/featureflags.go:302.41,306.6 3 1 +github.com/posthog/posthog-go/featureflags.go:306.6,308.10 2 1 +github.com/posthog/posthog-go/featureflags.go:309.26,312.10 3 1 +github.com/posthog/posthog-go/featureflags.go:313.29,315.33 2 1 +github.com/posthog/posthog-go/featureflags.go:316.18,317.33 1 0 +github.com/posthog/posthog-go/featureflags.go:325.58,329.16 4 1 +github.com/posthog/posthog-go/featureflags.go:329.16,332.3 2 1 +github.com/posthog/posthog-go/featureflags.go:333.2,336.50 2 1 +github.com/posthog/posthog-go/featureflags.go:336.50,345.3 7 1 +github.com/posthog/posthog-go/featureflags.go:347.2,347.37 1 1 +github.com/posthog/posthog-go/featureflags.go:347.37,350.3 2 1 +github.com/posthog/posthog-go/featureflags.go:352.2,354.16 3 1 +github.com/posthog/posthog-go/featureflags.go:354.16,357.3 2 0 +github.com/posthog/posthog-go/featureflags.go:358.2,359.70 2 1 +github.com/posthog/posthog-go/featureflags.go:359.70,362.3 2 1 +github.com/posthog/posthog-go/featureflags.go:363.2,368.50 6 1 +github.com/posthog/posthog-go/featureflags.go:368.50,370.3 1 1 +github.com/posthog/posthog-go/featureflags.go:373.102,378.20 3 1 +github.com/posthog/posthog-go/featureflags.go:378.20,387.3 1 1 +github.com/posthog/posthog-go/featureflags.go:389.2,389.16 1 1 +github.com/posthog/posthog-go/featureflags.go:389.16,391.3 1 1 +github.com/posthog/posthog-go/featureflags.go:393.2,393.70 1 1 +github.com/posthog/posthog-go/featureflags.go:393.70,395.17 2 1 +github.com/posthog/posthog-go/featureflags.go:395.17,397.4 1 1 +github.com/posthog/posthog-go/featureflags.go:400.2,400.20 1 1 +github.com/posthog/posthog-go/featureflags.go:403.104,408.20 3 1 +github.com/posthog/posthog-go/featureflags.go:408.20,417.3 1 1 +github.com/posthog/posthog-go/featureflags.go:418.2,418.16 1 1 +github.com/posthog/posthog-go/featureflags.go:418.16,420.3 1 1 +github.com/posthog/posthog-go/featureflags.go:420.8,420.27 1 1 +github.com/posthog/posthog-go/featureflags.go:420.27,422.9 2 1 +github.com/posthog/posthog-go/featureflags.go:422.9,424.4 1 1 +github.com/posthog/posthog-go/featureflags.go:427.2,427.71 1 1 +github.com/posthog/posthog-go/featureflags.go:427.71,429.17 2 1 +github.com/posthog/posthog-go/featureflags.go:429.17,431.4 1 1 +github.com/posthog/posthog-go/featureflags.go:433.3,433.21 1 1 +github.com/posthog/posthog-go/featureflags.go:436.2,436.57 1 1 +github.com/posthog/posthog-go/featureflags.go:439.102,442.16 3 1 +github.com/posthog/posthog-go/featureflags.go:442.16,444.3 1 1 +github.com/posthog/posthog-go/featureflags.go:447.2,447.42 1 1 +github.com/posthog/posthog-go/featureflags.go:447.42,448.39 1 1 +github.com/posthog/posthog-go/featureflags.go:448.39,450.9 2 1 +github.com/posthog/posthog-go/featureflags.go:454.2,454.25 1 1 +github.com/posthog/posthog-go/featureflags.go:457.115,460.16 3 1 +github.com/posthog/posthog-go/featureflags.go:460.16,462.3 1 0 +github.com/posthog/posthog-go/featureflags.go:463.2,466.28 3 1 +github.com/posthog/posthog-go/featureflags.go:466.28,468.3 1 1 +github.com/posthog/posthog-go/featureflags.go:468.8,469.43 1 1 +github.com/posthog/posthog-go/featureflags.go:469.43,478.18 2 1 +github.com/posthog/posthog-go/featureflags.go:478.18,481.5 2 1 +github.com/posthog/posthog-go/featureflags.go:481.10,483.5 1 1 +github.com/posthog/posthog-go/featureflags.go:487.2,487.57 1 1 +github.com/posthog/posthog-go/featureflags.go:487.57,495.17 2 1 +github.com/posthog/posthog-go/featureflags.go:495.17,497.4 1 1 +github.com/posthog/posthog-go/featureflags.go:498.3,498.27 1 1 +github.com/posthog/posthog-go/featureflags.go:498.27,499.49 1 1 +github.com/posthog/posthog-go/featureflags.go:499.49,501.5 1 1 +github.com/posthog/posthog-go/featureflags.go:505.2,505.22 1 1 +github.com/posthog/posthog-go/featureflags.go:514.24,515.80 1 1 +github.com/posthog/posthog-go/featureflags.go:515.80,517.3 1 1 +github.com/posthog/posthog-go/featureflags.go:519.2,519.18 1 1 +github.com/posthog/posthog-go/featureflags.go:519.18,521.3 1 1 +github.com/posthog/posthog-go/featureflags.go:524.2,528.16 3 1 +github.com/posthog/posthog-go/featureflags.go:528.16,530.3 1 0 +github.com/posthog/posthog-go/featureflags.go:531.2,532.33 2 1 +github.com/posthog/posthog-go/featureflags.go:532.33,534.3 1 1 +github.com/posthog/posthog-go/featureflags.go:536.2,536.51 1 1 +github.com/posthog/posthog-go/featureflags.go:536.51,539.14 2 1 +github.com/posthog/posthog-go/featureflags.go:539.14,542.4 2 0 +github.com/posthog/posthog-go/featureflags.go:544.3,546.14 2 1 +github.com/posthog/posthog-go/featureflags.go:546.14,549.4 2 1 +github.com/posthog/posthog-go/featureflags.go:551.3,552.57 2 1 +github.com/posthog/posthog-go/featureflags.go:552.57,554.4 1 1 +github.com/posthog/posthog-go/featureflags.go:555.3,555.139 1 1 +github.com/posthog/posthog-go/featureflags.go:556.8,558.57 2 1 +github.com/posthog/posthog-go/featureflags.go:558.57,560.4 1 1 +github.com/posthog/posthog-go/featureflags.go:561.3,561.122 1 1 +github.com/posthog/posthog-go/featureflags.go:565.74,569.38 3 1 +github.com/posthog/posthog-go/featureflags.go:569.38,570.86 1 1 +github.com/posthog/posthog-go/featureflags.go:570.86,572.4 1 1 +github.com/posthog/posthog-go/featureflags.go:575.2,575.13 1 1 +github.com/posthog/posthog-go/featureflags.go:578.64,584.59 4 1 +github.com/posthog/posthog-go/featureflags.go:584.59,586.3 1 1 +github.com/posthog/posthog-go/featureflags.go:588.2,588.49 1 1 +github.com/posthog/posthog-go/featureflags.go:588.49,593.3 4 1 +github.com/posthog/posthog-go/featureflags.go:595.2,595.20 1 1 +github.com/posthog/posthog-go/featureflags.go:605.24,609.39 3 1 +github.com/posthog/posthog-go/featureflags.go:609.39,611.17 2 1 +github.com/posthog/posthog-go/featureflags.go:611.17,613.38 2 1 +github.com/posthog/posthog-go/featureflags.go:613.38,616.5 1 1 +github.com/posthog/posthog-go/featureflags.go:618.4,619.40 2 1 +github.com/posthog/posthog-go/featureflags.go:619.40,623.5 1 1 +github.com/posthog/posthog-go/featureflags.go:623.10,625.5 1 0 +github.com/posthog/posthog-go/featureflags.go:628.3,628.14 1 1 +github.com/posthog/posthog-go/featureflags.go:628.14,632.148 3 1 +github.com/posthog/posthog-go/featureflags.go:632.148,634.5 1 1 +github.com/posthog/posthog-go/featureflags.go:634.10,636.5 1 1 +github.com/posthog/posthog-go/featureflags.go:640.2,640.20 1 1 +github.com/posthog/posthog-go/featureflags.go:640.20,642.3 1 1 +github.com/posthog/posthog-go/featureflags.go:644.2,644.19 1 1 +github.com/posthog/posthog-go/featureflags.go:655.17,656.35 1 1 +github.com/posthog/posthog-go/featureflags.go:656.35,661.45 2 1 +github.com/posthog/posthog-go/featureflags.go:661.45,662.29 1 1 +github.com/posthog/posthog-go/featureflags.go:662.29,664.5 1 1 +github.com/posthog/posthog-go/featureflags.go:664.10,664.34 1 1 +github.com/posthog/posthog-go/featureflags.go:664.34,666.5 1 1 +github.com/posthog/posthog-go/featureflags.go:666.10,668.5 1 1 +github.com/posthog/posthog-go/featureflags.go:670.4,670.30 1 1 +github.com/posthog/posthog-go/featureflags.go:670.30,672.5 1 1 +github.com/posthog/posthog-go/featureflags.go:676.2,676.40 1 1 +github.com/posthog/posthog-go/featureflags.go:676.40,678.3 1 1 +github.com/posthog/posthog-go/featureflags.go:680.2,680.18 1 1 +github.com/posthog/posthog-go/featureflags.go:683.235,686.9 3 1 +github.com/posthog/posthog-go/featureflags.go:686.9,690.3 1 1 +github.com/posthog/posthog-go/featureflags.go:692.2,692.111 1 1 +github.com/posthog/posthog-go/featureflags.go:695.248,699.22 3 1 +github.com/posthog/posthog-go/featureflags.go:699.22,702.3 1 0 +github.com/posthog/posthog-go/featureflags.go:704.2,706.31 2 1 +github.com/posthog/posthog-go/featureflags.go:706.31,707.31 1 1 +github.com/posthog/posthog-go/featureflags.go:708.23,709.35 1 1 +github.com/posthog/posthog-go/featureflags.go:709.35,715.19 2 0 +github.com/posthog/posthog-go/featureflags.go:715.19,717.40 2 0 +github.com/posthog/posthog-go/featureflags.go:717.40,720.7 1 0 +github.com/posthog/posthog-go/featureflags.go:722.6,723.42 2 0 +github.com/posthog/posthog-go/featureflags.go:723.42,725.7 1 0 +github.com/posthog/posthog-go/featureflags.go:725.12,727.7 1 0 +github.com/posthog/posthog-go/featureflags.go:730.5,730.27 1 0 +github.com/posthog/posthog-go/featureflags.go:730.27,731.18 1 0 +github.com/posthog/posthog-go/featureflags.go:731.18,733.7 1 0 +github.com/posthog/posthog-go/featureflags.go:734.11,736.17 1 0 +github.com/posthog/posthog-go/featureflags.go:736.17,738.7 1 0 +github.com/posthog/posthog-go/featureflags.go:740.10,752.33 4 1 +github.com/posthog/posthog-go/featureflags.go:752.33,754.6 1 1 +github.com/posthog/posthog-go/featureflags.go:754.11,754.38 1 1 +github.com/posthog/posthog-go/featureflags.go:754.38,756.6 1 0 +github.com/posthog/posthog-go/featureflags.go:756.11,758.6 1 1 +github.com/posthog/posthog-go/featureflags.go:760.5,760.19 1 1 +github.com/posthog/posthog-go/featureflags.go:760.19,762.40 2 1 +github.com/posthog/posthog-go/featureflags.go:762.40,765.7 1 0 +github.com/posthog/posthog-go/featureflags.go:767.6,768.42 2 1 +github.com/posthog/posthog-go/featureflags.go:768.42,770.7 1 1 +github.com/posthog/posthog-go/featureflags.go:770.12,772.7 1 0 +github.com/posthog/posthog-go/featureflags.go:775.5,776.27 2 1 +github.com/posthog/posthog-go/featureflags.go:776.27,778.31 1 1 +github.com/posthog/posthog-go/featureflags.go:778.31,780.7 1 1 +github.com/posthog/posthog-go/featureflags.go:781.6,781.29 1 1 +github.com/posthog/posthog-go/featureflags.go:781.29,783.7 1 1 +github.com/posthog/posthog-go/featureflags.go:784.11,786.30 1 1 +github.com/posthog/posthog-go/featureflags.go:786.30,788.7 1 1 +github.com/posthog/posthog-go/featureflags.go:789.6,789.30 1 1 +github.com/posthog/posthog-go/featureflags.go:789.30,791.7 1 0 +github.com/posthog/posthog-go/featureflags.go:797.2,797.26 1 1 +github.com/posthog/posthog-go/featureflags.go:797.26,799.3 1 1 +github.com/posthog/posthog-go/featureflags.go:802.2,802.32 1 1 +github.com/posthog/posthog-go/featureflags.go:805.80,809.35 4 1 +github.com/posthog/posthog-go/featureflags.go:809.35,811.3 1 1 +github.com/posthog/posthog-go/featureflags.go:813.2,813.30 1 1 +github.com/posthog/posthog-go/featureflags.go:813.30,815.3 1 0 +github.com/posthog/posthog-go/featureflags.go:817.2,819.25 2 1 +github.com/posthog/posthog-go/featureflags.go:819.25,820.28 1 1 +github.com/posthog/posthog-go/featureflags.go:821.22,822.43 1 1 +github.com/posthog/posthog-go/featureflags.go:823.11,824.39 1 1 +github.com/posthog/posthog-go/featureflags.go:828.2,828.26 1 1 +github.com/posthog/posthog-go/featureflags.go:828.26,829.28 1 0 +github.com/posthog/posthog-go/featureflags.go:830.22,831.44 1 0 +github.com/posthog/posthog-go/featureflags.go:832.11,833.39 1 0 +github.com/posthog/posthog-go/featureflags.go:837.2,837.26 1 1 +github.com/posthog/posthog-go/featureflags.go:837.26,839.3 1 0 +github.com/posthog/posthog-go/featureflags.go:841.2,841.29 1 1 +github.com/posthog/posthog-go/featureflags.go:841.29,843.3 1 1 +github.com/posthog/posthog-go/featureflags.go:845.2,845.33 1 1 +github.com/posthog/posthog-go/featureflags.go:845.33,847.3 1 0 +github.com/posthog/posthog-go/featureflags.go:849.2,849.25 1 1 +github.com/posthog/posthog-go/featureflags.go:849.25,853.17 2 1 +github.com/posthog/posthog-go/featureflags.go:853.17,855.4 1 1 +github.com/posthog/posthog-go/featureflags.go:857.3,859.12 2 1 +github.com/posthog/posthog-go/featureflags.go:859.12,861.4 1 1 +github.com/posthog/posthog-go/featureflags.go:861.9,863.4 1 1 +github.com/posthog/posthog-go/featureflags.go:866.2,866.29 1 1 +github.com/posthog/posthog-go/featureflags.go:866.29,870.44 3 0 +github.com/posthog/posthog-go/featureflags.go:870.44,872.4 1 0 +github.com/posthog/posthog-go/featureflags.go:872.9,872.45 1 0 +github.com/posthog/posthog-go/featureflags.go:872.45,875.4 2 0 +github.com/posthog/posthog-go/featureflags.go:875.9,878.4 2 0 +github.com/posthog/posthog-go/featureflags.go:881.3,881.17 1 0 +github.com/posthog/posthog-go/featureflags.go:881.17,883.4 1 0 +github.com/posthog/posthog-go/featureflags.go:885.3,886.53 2 0 +github.com/posthog/posthog-go/featureflags.go:886.53,888.4 1 0 +github.com/posthog/posthog-go/featureflags.go:888.9,888.54 1 0 +github.com/posthog/posthog-go/featureflags.go:888.54,891.4 2 0 +github.com/posthog/posthog-go/featureflags.go:891.9,894.4 2 0 +github.com/posthog/posthog-go/featureflags.go:896.3,896.13 1 0 +github.com/posthog/posthog-go/featureflags.go:896.13,898.4 1 0 +github.com/posthog/posthog-go/featureflags.go:898.9,900.4 1 0 +github.com/posthog/posthog-go/featureflags.go:903.2,903.22 1 1 +github.com/posthog/posthog-go/featureflags.go:903.22,905.17 2 1 +github.com/posthog/posthog-go/featureflags.go:905.17,907.4 1 0 +github.com/posthog/posthog-go/featureflags.go:909.3,909.54 1 1 +github.com/posthog/posthog-go/featureflags.go:912.2,912.22 1 1 +github.com/posthog/posthog-go/featureflags.go:912.22,914.17 2 1 +github.com/posthog/posthog-go/featureflags.go:914.17,916.4 1 0 +github.com/posthog/posthog-go/featureflags.go:918.3,918.54 1 1 +github.com/posthog/posthog-go/featureflags.go:921.2,921.23 1 1 +github.com/posthog/posthog-go/featureflags.go:921.23,923.17 2 1 +github.com/posthog/posthog-go/featureflags.go:923.17,925.4 1 0 +github.com/posthog/posthog-go/featureflags.go:927.3,927.55 1 1 +github.com/posthog/posthog-go/featureflags.go:930.2,930.23 1 1 +github.com/posthog/posthog-go/featureflags.go:930.23,932.17 2 1 +github.com/posthog/posthog-go/featureflags.go:932.17,934.4 1 0 +github.com/posthog/posthog-go/featureflags.go:936.3,936.55 1 1 +github.com/posthog/posthog-go/featureflags.go:939.2,939.72 1 1 +github.com/posthog/posthog-go/featureflags.go:943.99,945.16 2 1 +github.com/posthog/posthog-go/featureflags.go:945.16,948.3 2 0 +github.com/posthog/posthog-go/featureflags.go:949.2,950.16 2 1 +github.com/posthog/posthog-go/featureflags.go:950.16,953.3 2 0 +github.com/posthog/posthog-go/featureflags.go:955.2,955.55 1 1 +github.com/posthog/posthog-go/featureflags.go:958.57,960.25 2 1 +github.com/posthog/posthog-go/featureflags.go:961.11,962.17 1 1 +github.com/posthog/posthog-go/featureflags.go:963.12,964.17 1 0 +github.com/posthog/posthog-go/featureflags.go:965.13,966.17 1 0 +github.com/posthog/posthog-go/featureflags.go:967.13,968.17 1 0 +github.com/posthog/posthog-go/featureflags.go:969.13,970.17 1 0 +github.com/posthog/posthog-go/featureflags.go:971.15,972.17 1 0 +github.com/posthog/posthog-go/featureflags.go:973.15,974.17 1 0 +github.com/posthog/posthog-go/featureflags.go:975.13,976.17 1 0 +github.com/posthog/posthog-go/featureflags.go:977.14,978.17 1 0 +github.com/posthog/posthog-go/featureflags.go:979.14,980.17 1 0 +github.com/posthog/posthog-go/featureflags.go:981.14,982.17 1 0 +github.com/posthog/posthog-go/featureflags.go:983.10,985.37 2 0 +github.com/posthog/posthog-go/featureflags.go:988.2,988.15 1 1 +github.com/posthog/posthog-go/featureflags.go:991.52,992.22 1 1 +github.com/posthog/posthog-go/featureflags.go:992.22,993.13 1 1 +github.com/posthog/posthog-go/featureflags.go:993.13,995.4 1 1 +github.com/posthog/posthog-go/featureflags.go:997.2,997.14 1 1 +github.com/posthog/posthog-go/featureflags.go:1000.66,1001.38 1 1 +github.com/posthog/posthog-go/featureflags.go:1001.38,1002.25 1 1 +github.com/posthog/posthog-go/featureflags.go:1002.25,1004.4 1 1 +github.com/posthog/posthog-go/featureflags.go:1006.2,1006.14 1 1 +github.com/posthog/posthog-go/featureflags.go:1010.87,1013.2 2 1 +github.com/posthog/posthog-go/featureflags.go:1015.61,1020.2 4 1 +github.com/posthog/posthog-go/featureflags.go:1022.76,1027.32 4 1 +github.com/posthog/posthog-go/featureflags.go:1027.32,1030.3 1 1 +github.com/posthog/posthog-go/featureflags.go:1032.2,1032.33 1 1 +github.com/posthog/posthog-go/featureflags.go:1035.121,1043.2 6 1 +github.com/posthog/posthog-go/featureflags.go:1045.181,1049.16 3 1 +github.com/posthog/posthog-go/featureflags.go:1049.16,1053.3 3 0 +github.com/posthog/posthog-go/featureflags.go:1055.2,1061.32 5 1 +github.com/posthog/posthog-go/featureflags.go:1061.32,1063.3 1 1 +github.com/posthog/posthog-go/featureflags.go:1065.2,1066.16 2 1 +github.com/posthog/posthog-go/featureflags.go:1066.16,1068.3 1 1 +github.com/posthog/posthog-go/featureflags.go:1070.2,1070.25 1 1 +github.com/posthog/posthog-go/featureflags.go:1073.49,1075.2 1 1 +github.com/posthog/posthog-go/featureflags.go:1077.52,1079.2 1 1 +github.com/posthog/posthog-go/featureflags.go:1085.184,1087.2 1 1 +github.com/posthog/posthog-go/featureflags.go:1090.201,1092.16 2 1 +github.com/posthog/posthog-go/featureflags.go:1092.16,1094.3 1 0 +github.com/posthog/posthog-go/featureflags.go:1096.2,1099.29 3 1 +github.com/posthog/posthog-go/featureflags.go:1099.29,1110.17 2 1 +github.com/posthog/posthog-go/featureflags.go:1110.17,1112.40 2 1 +github.com/posthog/posthog-go/featureflags.go:1112.40,1113.13 1 1 +github.com/posthog/posthog-go/featureflags.go:1115.4,1115.19 1 0 +github.com/posthog/posthog-go/featureflags.go:1119.3,1119.25 1 1 +github.com/posthog/posthog-go/featureflags.go:1119.25,1121.4 1 1 +github.com/posthog/posthog-go/featureflags.go:1124.2,1124.20 1 1 +github.com/posthog/posthog-go/featureflags.go:1127.192,1132.23 3 1 +github.com/posthog/posthog-go/featureflags.go:1132.23,1134.3 1 1 +github.com/posthog/posthog-go/featureflags.go:1136.2,1136.61 1 1 +github.com/posthog/posthog-go/featureflags.go:1136.61,1137.21 1 1 +github.com/posthog/posthog-go/featureflags.go:1137.21,1139.4 1 1 +github.com/posthog/posthog-go/featureflags.go:1141.2,1141.20 1 1 +github.com/posthog/posthog-go/featureflags.go:1144.187,1146.16 2 1 +github.com/posthog/posthog-go/featureflags.go:1146.16,1148.3 1 1 +github.com/posthog/posthog-go/featureflags.go:1149.2,1149.26 1 1 +github.com/posthog/posthog-go/featureflags.go:1149.26,1151.3 1 1 +github.com/posthog/posthog-go/featureflags.go:1152.2,1152.16 1 0 +github.com/posthog/posthog-go/featureflags.go:1155.66,1156.37 1 1 +github.com/posthog/posthog-go/featureflags.go:1157.9,1158.11 1 1 +github.com/posthog/posthog-go/featureflags.go:1159.10,1161.22 2 1 +github.com/posthog/posthog-go/flags.go:48.44,49.22 1 1 +github.com/posthog/posthog-go/flags.go:49.22,51.3 1 1 +github.com/posthog/posthog-go/flags.go:52.2,52.18 1 1 +github.com/posthog/posthog-go/flags.go:56.79,60.27 3 1 +github.com/posthog/posthog-go/flags.go:61.14,63.17 2 1 +github.com/posthog/posthog-go/flags.go:64.12,65.14 1 1 +github.com/posthog/posthog-go/flags.go:66.10,67.18 1 0 +github.com/posthog/posthog-go/flags.go:70.2,78.3 1 1 +github.com/posthog/posthog-go/flags.go:102.58,110.69 3 1 +github.com/posthog/posthog-go/flags.go:110.69,118.34 5 1 +github.com/posthog/posthog-go/flags.go:118.34,120.36 2 1 +github.com/posthog/posthog-go/flags.go:120.36,122.5 1 1 +github.com/posthog/posthog-go/flags.go:124.3,124.13 1 1 +github.com/posthog/posthog-go/flags.go:128.2,135.50 3 1 +github.com/posthog/posthog-go/flags.go:135.50,137.3 1 0 +github.com/posthog/posthog-go/flags.go:140.2,146.42 5 1 +github.com/posthog/posthog-go/flags.go:146.42,148.53 2 1 +github.com/posthog/posthog-go/flags.go:148.53,150.4 1 1 +github.com/posthog/posthog-go/flags.go:151.3,151.55 1 1 +github.com/posthog/posthog-go/flags.go:153.2,153.12 1 1 +github.com/posthog/posthog-go/flags.go:173.80,178.16 3 1 +github.com/posthog/posthog-go/flags.go:178.16,180.3 1 0 +github.com/posthog/posthog-go/flags.go:182.2,188.8 1 1 +github.com/posthog/posthog-go/flags.go:194.84,205.16 3 1 +github.com/posthog/posthog-go/flags.go:205.16,207.3 1 0 +github.com/posthog/posthog-go/flags.go:209.2,210.16 2 1 +github.com/posthog/posthog-go/flags.go:210.16,212.3 1 0 +github.com/posthog/posthog-go/flags.go:214.2,223.16 7 1 +github.com/posthog/posthog-go/flags.go:223.16,225.3 1 1 +github.com/posthog/posthog-go/flags.go:226.2,228.37 2 1 +github.com/posthog/posthog-go/flags.go:228.37,230.3 1 1 +github.com/posthog/posthog-go/flags.go:232.2,233.16 2 1 +github.com/posthog/posthog-go/flags.go:233.16,235.3 1 0 +github.com/posthog/posthog-go/flags.go:237.2,239.16 3 1 +github.com/posthog/posthog-go/flags.go:239.16,241.3 1 1 +github.com/posthog/posthog-go/flags.go:243.2,243.45 1 1 +github.com/posthog/posthog-go/flags.go:243.45,245.3 1 0 +github.com/posthog/posthog-go/flags.go:247.2,247.28 1 1 +github.com/posthog/posthog-go/group_identify.go:18.37,19.27 1 0 +github.com/posthog/posthog-go/group_identify.go:22.43,23.24 1 1 +github.com/posthog/posthog-go/group_identify.go:23.24,29.3 1 1 +github.com/posthog/posthog-go/group_identify.go:31.2,31.23 1 1 +github.com/posthog/posthog-go/group_identify.go:31.23,37.3 1 1 +github.com/posthog/posthog-go/group_identify.go:39.2,39.12 1 1 +github.com/posthog/posthog-go/group_identify.go:52.45,60.22 2 1 +github.com/posthog/posthog-go/group_identify.go:60.22,62.3 1 1 +github.com/posthog/posthog-go/group_identify.go:64.2,75.16 3 1 +github.com/posthog/posthog-go/groups.go:9.25,11.2 1 1 +github.com/posthog/posthog-go/groups.go:13.60,16.2 2 1 +github.com/posthog/posthog-go/identify.go:19.32,20.27 1 0 +github.com/posthog/posthog-go/identify.go:23.38,24.30 1 1 +github.com/posthog/posthog-go/identify.go:24.30,30.3 1 1 +github.com/posthog/posthog-go/identify.go:32.2,32.12 1 1 +github.com/posthog/posthog-go/identify.go:47.40,49.22 2 1 +github.com/posthog/posthog-go/identify.go:49.22,51.3 1 1 +github.com/posthog/posthog-go/identify.go:53.2,65.16 2 1 +github.com/posthog/posthog-go/json.go:12.84,16.14 3 1 +github.com/posthog/posthog-go/json.go:16.14,18.3 1 1 +github.com/posthog/posthog-go/json.go:20.2,20.26 1 1 +github.com/posthog/posthog-go/json.go:20.26,25.56 4 1 +github.com/posthog/posthog-go/json.go:25.56,27.4 1 1 +github.com/posthog/posthog-go/json.go:30.2,30.10 1 1 +github.com/posthog/posthog-go/json.go:35.77,38.41 2 1 +github.com/posthog/posthog-go/json.go:38.41,40.3 1 1 +github.com/posthog/posthog-go/json.go:40.8,42.3 1 1 +github.com/posthog/posthog-go/json.go:44.2,44.45 1 1 +github.com/posthog/posthog-go/json.go:44.45,46.3 1 1 +github.com/posthog/posthog-go/json.go:48.2,48.8 1 1 +github.com/posthog/posthog-go/json.go:54.40,55.18 1 1 +github.com/posthog/posthog-go/json.go:56.65,57.22 1 1 +github.com/posthog/posthog-go/json.go:59.20,60.19 1 1 +github.com/posthog/posthog-go/json.go:62.78,63.22 1 1 +github.com/posthog/posthog-go/json.go:65.100,66.23 1 1 +github.com/posthog/posthog-go/json.go:68.40,69.24 1 1 +github.com/posthog/posthog-go/json.go:71.38,72.19 1 1 +github.com/posthog/posthog-go/json.go:74.22,75.44 1 1 +github.com/posthog/posthog-go/json.go:75.44,76.32 1 1 +github.com/posthog/posthog-go/json.go:76.32,78.5 1 1 +github.com/posthog/posthog-go/json.go:80.3,80.14 1 1 +github.com/posthog/posthog-go/json.go:82.23,83.14 1 1 +github.com/posthog/posthog-go/json.go:86.2,86.14 1 1 +github.com/posthog/posthog-go/logger.go:34.57,39.2 1 1 +github.com/posthog/posthog-go/logger.go:46.63,47.15 1 1 +github.com/posthog/posthog-go/logger.go:47.15,49.3 1 0 +github.com/posthog/posthog-go/logger.go:52.61,54.2 1 1 +github.com/posthog/posthog-go/logger.go:56.62,58.2 1 1 +github.com/posthog/posthog-go/logger.go:60.63,62.2 1 1 +github.com/posthog/posthog-go/logger.go:64.44,66.2 1 1 +github.com/posthog/posthog-go/message.go:47.58,48.24 1 1 +github.com/posthog/posthog-go/message.go:48.24,50.3 1 1 +github.com/posthog/posthog-go/message.go:51.2,51.10 1 1 +github.com/posthog/posthog-go/message.go:70.71,71.49 1 1 +github.com/posthog/posthog-go/message.go:71.49,72.31 1 1 +github.com/posthog/posthog-go/message.go:72.31,74.4 1 1 +github.com/posthog/posthog-go/message.go:74.9,76.4 1 1 +github.com/posthog/posthog-go/message.go:78.2,78.8 1 1 +github.com/posthog/posthog-go/message.go:81.48,83.2 1 1 +github.com/posthog/posthog-go/message.go:85.29,88.2 1 1 +github.com/posthog/posthog-go/message.go:97.54,98.44 1 1 +github.com/posthog/posthog-go/message.go:98.44,100.3 1 1 +github.com/posthog/posthog-go/message.go:102.2,102.22 1 1 +github.com/posthog/posthog-go/message.go:102.22,104.3 1 1 +github.com/posthog/posthog-go/message.go:106.2,109.50 3 1 +github.com/posthog/posthog-go/message.go:109.50,111.3 1 1 +github.com/posthog/posthog-go/message.go:113.2,113.8 1 1 +github.com/posthog/posthog-go/message.go:116.49,119.2 2 1 +github.com/posthog/posthog-go/posthog.go:121.32,125.2 2 1 +github.com/posthog/posthog-go/posthog.go:132.74,133.41 1 1 +github.com/posthog/posthog-go/posthog.go:133.41,135.3 1 1 +github.com/posthog/posthog-go/posthog.go:137.2,139.40 3 1 +github.com/posthog/posthog-go/posthog.go:139.40,141.3 1 0 +github.com/posthog/posthog-go/posthog.go:142.2,153.16 3 1 +github.com/posthog/posthog-go/posthog.go:153.16,155.3 1 0 +github.com/posthog/posthog-go/posthog.go:157.2,157.31 1 1 +github.com/posthog/posthog-go/posthog.go:157.31,170.17 2 1 +github.com/posthog/posthog-go/posthog.go:170.17,172.4 1 0 +github.com/posthog/posthog-go/posthog.go:175.2,178.8 3 1 +github.com/posthog/posthog-go/posthog.go:181.62,185.32 2 1 +github.com/posthog/posthog-go/posthog.go:185.32,187.3 1 1 +github.com/posthog/posthog-go/posthog.go:188.2,188.19 1 1 +github.com/posthog/posthog-go/posthog.go:191.46,192.25 1 1 +github.com/posthog/posthog-go/posthog.go:193.14,194.15 1 1 +github.com/posthog/posthog-go/posthog.go:194.15,196.4 1 0 +github.com/posthog/posthog-go/posthog.go:197.3,197.12 1 1 +github.com/posthog/posthog-go/posthog.go:198.17,199.15 1 1 +github.com/posthog/posthog-go/posthog.go:199.15,201.4 1 0 +github.com/posthog/posthog-go/posthog.go:202.3,202.12 1 1 +github.com/posthog/posthog-go/posthog.go:203.22,204.15 1 1 +github.com/posthog/posthog-go/posthog.go:204.15,206.4 1 0 +github.com/posthog/posthog-go/posthog.go:207.3,207.12 1 1 +github.com/posthog/posthog-go/posthog.go:208.16,209.15 1 1 +github.com/posthog/posthog-go/posthog.go:209.15,211.4 1 0 +github.com/posthog/posthog-go/posthog.go:212.3,212.12 1 1 +github.com/posthog/posthog-go/posthog.go:213.18,214.15 1 1 +github.com/posthog/posthog-go/posthog.go:214.15,216.4 1 0 +github.com/posthog/posthog-go/posthog.go:217.3,217.12 1 1 +github.com/posthog/posthog-go/posthog.go:220.2,220.12 1 1 +github.com/posthog/posthog-go/posthog.go:223.51,225.38 2 1 +github.com/posthog/posthog-go/posthog.go:225.38,227.3 1 1 +github.com/posthog/posthog-go/posthog.go:229.2,231.25 2 1 +github.com/posthog/posthog-go/posthog.go:232.13,236.10 4 1 +github.com/posthog/posthog-go/posthog.go:238.16,242.10 4 1 +github.com/posthog/posthog-go/posthog.go:244.21,247.10 3 1 +github.com/posthog/posthog-go/posthog.go:249.15,252.33 3 1 +github.com/posthog/posthog-go/posthog.go:252.33,259.19 4 1 +github.com/posthog/posthog-go/posthog.go:259.19,260.37 1 1 +github.com/posthog/posthog-go/posthog.go:260.37,262.6 1 1 +github.com/posthog/posthog-go/posthog.go:263.5,263.36 1 1 +github.com/posthog/posthog-go/posthog.go:263.36,265.6 1 1 +github.com/posthog/posthog-go/posthog.go:268.4,269.18 2 1 +github.com/posthog/posthog-go/posthog.go:269.18,271.5 1 0 +github.com/posthog/posthog-go/posthog.go:273.4,273.27 1 1 +github.com/posthog/posthog-go/posthog.go:273.27,275.5 1 1 +github.com/posthog/posthog-go/posthog.go:277.4,277.50 1 1 +github.com/posthog/posthog-go/posthog.go:277.50,280.5 2 1 +github.com/posthog/posthog-go/posthog.go:282.4,284.35 3 1 +github.com/posthog/posthog-go/posthog.go:284.35,287.5 2 1 +github.com/posthog/posthog-go/posthog.go:288.4,288.55 1 1 +github.com/posthog/posthog-go/posthog.go:290.3,290.26 1 1 +github.com/posthog/posthog-go/posthog.go:290.26,292.4 1 1 +github.com/posthog/posthog-go/posthog.go:293.3,295.10 3 1 +github.com/posthog/posthog-go/posthog.go:297.17,301.10 4 1 +github.com/posthog/posthog-go/posthog.go:303.10,305.9 2 1 +github.com/posthog/posthog-go/posthog.go:308.2,308.15 1 1 +github.com/posthog/posthog-go/posthog.go:308.15,313.23 1 1 +github.com/posthog/posthog-go/posthog.go:313.23,315.4 1 1 +github.com/posthog/posthog-go/posthog.go:318.2,320.8 2 1 +github.com/posthog/posthog-go/posthog.go:323.54,327.2 3 1 +github.com/posthog/posthog-go/posthog.go:329.50,332.32 3 1 +github.com/posthog/posthog-go/posthog.go:332.32,334.3 1 1 +github.com/posthog/posthog-go/posthog.go:336.2,337.19 2 1 +github.com/posthog/posthog-go/posthog.go:340.87,341.46 1 1 +github.com/posthog/posthog-go/posthog.go:341.46,343.3 1 0 +github.com/posthog/posthog-go/posthog.go:345.2,346.16 2 1 +github.com/posthog/posthog-go/posthog.go:346.16,348.3 1 1 +github.com/posthog/posthog-go/posthog.go:350.2,350.20 1 1 +github.com/posthog/posthog-go/posthog.go:353.45,354.33 1 1 +github.com/posthog/posthog-go/posthog.go:354.33,358.3 3 1 +github.com/posthog/posthog-go/posthog.go:359.2,360.12 2 1 +github.com/posthog/posthog-go/posthog.go:363.87,364.46 1 1 +github.com/posthog/posthog-go/posthog.go:364.46,366.3 1 0 +github.com/posthog/posthog-go/posthog.go:368.2,371.33 3 1 +github.com/posthog/posthog-go/posthog.go:371.33,375.3 1 1 +github.com/posthog/posthog-go/posthog.go:375.8,379.3 2 1 +github.com/posthog/posthog-go/posthog.go:381.2,381.21 1 1 +github.com/posthog/posthog-go/posthog.go:384.85,385.46 1 1 +github.com/posthog/posthog-go/posthog.go:385.46,387.3 1 0 +github.com/posthog/posthog-go/posthog.go:389.2,394.33 5 1 +github.com/posthog/posthog-go/posthog.go:394.33,398.3 1 1 +github.com/posthog/posthog-go/posthog.go:398.8,403.42 3 1 +github.com/posthog/posthog-go/posthog.go:403.42,406.4 2 1 +github.com/posthog/posthog-go/posthog.go:409.2,410.96 2 1 +github.com/posthog/posthog-go/posthog.go:410.96,416.23 2 1 +github.com/posthog/posthog-go/posthog.go:416.23,418.4 1 1 +github.com/posthog/posthog-go/posthog.go:420.3,420.24 1 1 +github.com/posthog/posthog-go/posthog.go:420.24,423.32 3 1 +github.com/posthog/posthog-go/posthog.go:423.32,425.5 1 1 +github.com/posthog/posthog-go/posthog.go:428.3,433.13 1 1 +github.com/posthog/posthog-go/posthog.go:433.13,435.4 1 1 +github.com/posthog/posthog-go/posthog.go:438.2,438.23 1 1 +github.com/posthog/posthog-go/posthog.go:441.73,443.2 1 1 +github.com/posthog/posthog-go/posthog.go:451.59,452.33 1 1 +github.com/posthog/posthog-go/posthog.go:452.33,456.3 3 1 +github.com/posthog/posthog-go/posthog.go:457.2,457.47 1 1 +github.com/posthog/posthog-go/posthog.go:464.98,465.46 1 1 +github.com/posthog/posthog-go/posthog.go:465.46,467.3 1 0 +github.com/posthog/posthog-go/posthog.go:469.2,472.33 3 1 +github.com/posthog/posthog-go/posthog.go:472.33,476.3 1 1 +github.com/posthog/posthog-go/posthog.go:476.8,481.3 2 1 +github.com/posthog/posthog-go/posthog.go:483.2,483.24 1 1 +github.com/posthog/posthog-go/posthog.go:487.38,488.15 1 1 +github.com/posthog/posthog-go/posthog.go:488.15,491.23 1 1 +github.com/posthog/posthog-go/posthog.go:491.23,493.4 1 1 +github.com/posthog/posthog-go/posthog.go:495.2,497.8 3 1 +github.com/posthog/posthog-go/posthog.go:501.78,504.19 2 1 +github.com/posthog/posthog-go/posthog.go:504.19,506.16 2 1 +github.com/posthog/posthog-go/posthog.go:506.16,510.36 1 1 +github.com/posthog/posthog-go/posthog.go:510.36,512.5 1 0 +github.com/posthog/posthog-go/posthog.go:514.3,514.15 1 1 +github.com/posthog/posthog-go/posthog.go:515.5,519.3 3 1 +github.com/posthog/posthog-go/posthog.go:523.39,532.16 3 1 +github.com/posthog/posthog-go/posthog.go:532.16,536.3 3 0 +github.com/posthog/posthog-go/posthog.go:538.2,538.33 1 1 +github.com/posthog/posthog-go/posthog.go:538.33,539.36 1 1 +github.com/posthog/posthog-go/posthog.go:539.36,542.4 2 1 +github.com/posthog/posthog-go/posthog.go:545.3,545.10 1 1 +github.com/posthog/posthog-go/posthog.go:546.38,546.38 0 1 +github.com/posthog/posthog-go/posthog.go:547.17,550.10 3 1 +github.com/posthog/posthog-go/posthog.go:554.2,555.28 2 1 +github.com/posthog/posthog-go/posthog.go:559.41,562.16 3 1 +github.com/posthog/posthog-go/posthog.go:562.16,565.3 2 0 +github.com/posthog/posthog-go/posthog.go:567.2,575.16 6 1 +github.com/posthog/posthog-go/posthog.go:575.16,578.3 2 1 +github.com/posthog/posthog-go/posthog.go:580.2,581.22 2 1 +github.com/posthog/posthog-go/posthog.go:585.57,588.26 2 1 +github.com/posthog/posthog-go/posthog.go:588.26,591.3 2 1 +github.com/posthog/posthog-go/posthog.go:593.2,593.54 1 1 +github.com/posthog/posthog-go/posthog.go:593.54,596.3 2 1 +github.com/posthog/posthog-go/posthog.go:598.2,599.56 2 1 +github.com/posthog/posthog-go/posthog.go:603.25,605.33 2 1 +github.com/posthog/posthog-go/posthog.go:605.33,607.3 1 1 +github.com/posthog/posthog-go/posthog.go:609.2,623.6 8 1 +github.com/posthog/posthog-go/posthog.go:623.6,624.10 1 1 +github.com/posthog/posthog-go/posthog.go:625.24,626.28 1 1 +github.com/posthog/posthog-go/posthog.go:628.17,629.24 1 1 +github.com/posthog/posthog-go/posthog.go:631.17,637.28 3 1 +github.com/posthog/posthog-go/posthog.go:637.28,639.5 1 1 +github.com/posthog/posthog-go/posthog.go:641.4,643.10 3 1 +github.com/posthog/posthog-go/posthog.go:648.88,652.60 3 1 +github.com/posthog/posthog-go/posthog.go:652.60,656.3 3 1 +github.com/posthog/posthog-go/posthog.go:658.2,660.38 2 1 +github.com/posthog/posthog-go/posthog.go:660.38,663.3 2 1 +github.com/posthog/posthog-go/posthog.go:666.75,667.36 1 1 +github.com/posthog/posthog-go/posthog.go:667.36,670.3 2 1 +github.com/posthog/posthog-go/posthog.go:673.61,675.2 1 1 +github.com/posthog/posthog-go/posthog.go:677.61,679.2 1 1 +github.com/posthog/posthog-go/posthog.go:681.38,686.2 2 1 +github.com/posthog/posthog-go/posthog.go:688.48,689.23 1 1 +github.com/posthog/posthog-go/posthog.go:689.23,690.26 1 1 +github.com/posthog/posthog-go/posthog.go:690.26,692.4 1 1 +github.com/posthog/posthog-go/posthog.go:696.59,697.23 1 1 +github.com/posthog/posthog-go/posthog.go:697.23,698.26 1 1 +github.com/posthog/posthog-go/posthog.go:698.26,700.4 1 1 +github.com/posthog/posthog-go/posthog.go:704.171,706.2 1 0 +github.com/posthog/posthog-go/posthog.go:708.216,709.33 1 1 +github.com/posthog/posthog-go/posthog.go:709.33,713.3 3 0 +github.com/posthog/posthog-go/posthog.go:716.2,716.51 1 1 +github.com/posthog/posthog-go/posthog.go:716.51,718.3 1 1 +github.com/posthog/posthog-go/posthog.go:720.2,721.16 2 1 +github.com/posthog/posthog-go/posthog.go:721.16,723.3 1 0 +github.com/posthog/posthog-go/posthog.go:724.2,724.42 1 1 +github.com/posthog/posthog-go/posthog.go:727.74,729.16 2 1 +github.com/posthog/posthog-go/posthog.go:729.16,731.3 1 0 +github.com/posthog/posthog-go/posthog.go:733.2,734.16 2 1 +github.com/posthog/posthog-go/posthog.go:734.16,736.3 1 0 +github.com/posthog/posthog-go/posthog.go:738.2,743.16 5 1 +github.com/posthog/posthog-go/posthog.go:743.16,745.3 1 0 +github.com/posthog/posthog-go/posthog.go:747.2,752.16 5 1 +github.com/posthog/posthog-go/posthog.go:752.16,754.3 1 0 +github.com/posthog/posthog-go/posthog.go:755.2,757.37 2 1 +github.com/posthog/posthog-go/posthog.go:757.37,759.3 1 0 +github.com/posthog/posthog-go/posthog.go:761.2,762.16 2 1 +github.com/posthog/posthog-go/posthog.go:762.16,764.3 1 0 +github.com/posthog/posthog-go/posthog.go:766.2,767.63 2 1 +github.com/posthog/posthog-go/posthog.go:767.63,769.3 1 0 +github.com/posthog/posthog-go/posthog.go:770.2,770.26 1 1 +github.com/posthog/posthog-go/posthog.go:774.80,775.39 1 1 +github.com/posthog/posthog-go/posthog.go:775.39,777.3 1 1 +github.com/posthog/posthog-go/posthog.go:778.2,778.60 1 1 +github.com/posthog/posthog-go/posthog.go:778.60,779.40 1 1 +github.com/posthog/posthog-go/posthog.go:779.40,782.4 2 1 +github.com/posthog/posthog-go/posthog.go:784.2,784.14 1 0 +github.com/posthog/posthog-go/posthog.go:788.71,792.16 2 1 +github.com/posthog/posthog-go/posthog.go:792.16,794.3 1 1 +github.com/posthog/posthog-go/posthog.go:796.2,796.26 1 1 +github.com/posthog/posthog-go/posthog.go:796.26,798.3 1 0 +github.com/posthog/posthog-go/posthog.go:799.2,801.49 2 1 +github.com/posthog/posthog-go/posthog.go:801.49,803.3 1 1 +github.com/posthog/posthog-go/posthog.go:805.2,805.52 1 1 +github.com/posthog/posthog-go/posthog.go:805.52,807.3 1 1 +github.com/posthog/posthog-go/posthog.go:809.2,809.30 1 1 +github.com/posthog/posthog-go/posthog.go:812.180,814.16 2 1 +github.com/posthog/posthog-go/posthog.go:814.16,816.3 1 1 +github.com/posthog/posthog-go/posthog.go:818.2,818.49 1 1 +github.com/posthog/posthog-go/posthog.go:818.49,820.3 1 1 +github.com/posthog/posthog-go/posthog.go:822.2,822.61 1 1 +github.com/posthog/posthog-go/posthog.go:822.61,824.3 1 1 +github.com/posthog/posthog-go/posthog.go:826.2,826.16 1 1 +github.com/posthog/posthog-go/posthog.go:829.181,831.16 2 1 +github.com/posthog/posthog-go/posthog.go:831.16,833.3 1 1 +github.com/posthog/posthog-go/posthog.go:835.2,835.49 1 1 +github.com/posthog/posthog-go/posthog.go:835.49,837.3 1 1 +github.com/posthog/posthog-go/posthog.go:839.2,839.40 1 1 +github.com/posthog/posthog-go/properties.go:17.33,19.2 1 1 +github.com/posthog/posthog-go/properties.go:21.68,24.2 2 1 +github.com/posthog/posthog-go/properties.go:28.56,29.18 1 1 +github.com/posthog/posthog-go/properties.go:29.18,31.3 1 1 +github.com/posthog/posthog-go/properties.go:33.2,33.26 1 1 +github.com/posthog/posthog-go/properties.go:33.26,35.3 1 1 +github.com/posthog/posthog-go/properties.go:37.2,37.10 1 1 +github.com/posthog/posthog-go/timeout_16.go:9.56,11.2 1 1 +github.com/posthog/posthog-go/version.go:9.26,10.34 1 1 +github.com/posthog/posthog-go/version.go:10.34,12.3 1 1 +github.com/posthog/posthog-go/version.go:13.2,13.16 1 0 diff --git a/error_tracking.go b/error_tracking.go index 0b9443b..07e62d3 100644 --- a/error_tracking.go +++ b/error_tracking.go @@ -11,6 +11,7 @@ type Exception struct { DistinctId string Timestamp time.Time + Properties Properties DisableGeoIP bool // Typed properties that end up in the API "properties" object: @@ -51,21 +52,12 @@ type StackFrame struct { } type ExceptionInApi struct { - Type string `json:"type"` - Library string `json:"library"` - LibraryVersion string `json:"library_version"` - Timestamp time.Time `json:"timestamp"` - Event string `json:"event"` - Properties ExceptionInApiProperties `json:"properties"` -} - -type ExceptionInApiProperties struct { - Lib string `json:"$lib"` - LibVersion string `json:"$lib_version"` - DistinctId string `json:"distinct_id"` - DisableGeoIP bool `json:"$geoip_disable,omitempty"` - ExceptionList []ExceptionItem `json:"$exception_list"` - ExceptionFingerprint *string `json:"$exception_fingerprint,omitempty"` + Type string `json:"type"` + Library string `json:"library"` + LibraryVersion string `json:"library_version"` + Timestamp time.Time `json:"timestamp"` + Event string `json:"event"` + Properties Properties `json:"properties"` } func (msg Exception) internal() { panic(unimplementedError) } @@ -116,25 +108,39 @@ func (msg ExceptionItem) Validate() error { func (msg Exception) APIfy() APIMessage { libVersion := getVersion() + properties := Properties{}. + Set("$lib", SDKName). + Set("$lib_version", libVersion). + Set("distinct_id", msg.DistinctId). + Set("$exception_list", msg.ExceptionList) + + if msg.DisableGeoIP { + properties.Set("$geoip_disable", true) + } + + if msg.ExceptionFingerprint != nil { + properties.Set("$exception_fingerprint", msg.ExceptionFingerprint) + } + + if msg.Properties != nil { + for k, v := range msg.Properties { + properties[k] = v + } + } + return ExceptionInApi{ - Type: msg.Type, // set to "exception" by Enqueue switch + Type: msg.Type, Event: "$exception", Library: SDKName, LibraryVersion: libVersion, Timestamp: msg.Timestamp, - Properties: ExceptionInApiProperties{ - Lib: SDKName, - LibVersion: libVersion, - DistinctId: msg.DistinctId, - DisableGeoIP: msg.DisableGeoIP, - ExceptionList: msg.ExceptionList, - ExceptionFingerprint: msg.ExceptionFingerprint, - }, + Properties: properties, } } // NewDefaultException is a convenience function to build an Exception object (usable for `client.Enqueue`) // with sane defaults. If you want more control, please manually build the Exception object. +// Use .WithProperties() to add custom properties to the exception. func NewDefaultException( timestamp time.Time, distinctID, title, description string, @@ -153,3 +159,8 @@ func NewDefaultException( }, } } + +func (e Exception) WithProperties(properties Properties) Exception { + e.Properties = properties + return e +} diff --git a/error_tracking_slog.go b/error_tracking_slog.go index b35e0f2..74d3ab5 100644 --- a/error_tracking_slog.go +++ b/error_tracking_slog.go @@ -69,6 +69,7 @@ func (h *SlogCaptureHandler) Handle(ctx context.Context, r slog.Record) error { }, }, ExceptionFingerprint: h.cfg.fingerprint(ctx, r), + Properties: h.cfg.properties(ctx, r), } _ = h.client.Enqueue(ex) // ignore enqueue error to keep logging safe diff --git a/error_tracking_slog_options.go b/error_tracking_slog_options.go index b407213..6122496 100644 --- a/error_tracking_slog_options.go +++ b/error_tracking_slog_options.go @@ -36,6 +36,9 @@ type captureConfig struct { // record for fields like "err" or "error" and uses the extracted // error message as the description. descriptionExtractor DescriptionExtractor + + // event properties to attach to the captured exception event. + properties func(ctx context.Context, r slog.Record) Properties } func defaultCaptureConfig() captureConfig { @@ -55,6 +58,9 @@ func defaultCaptureConfig() captureConfig { ErrorKeys: []string{"err", "error"}, Fallback: "", }, + properties: func(ctx context.Context, r slog.Record) Properties { + return NewProperties() + }, } } @@ -87,3 +93,9 @@ func WithStackTraceExtractor(extractor StackTraceExtractor) SlogOption { func WithDescriptionExtractor(extractor DescriptionExtractor) SlogOption { return func(c *captureConfig) { c.descriptionExtractor = extractor } } + +// WithPropertiesFn sets a custom function to extract properties from slog records. +// This allows you to attach custom metadata from log records to exception events. +func WithPropertiesFn(fn func(ctx context.Context, r slog.Record) Properties) SlogOption { + return func(c *captureConfig) { c.properties = fn } +} diff --git a/error_tracking_slog_test.go b/error_tracking_slog_test.go index d561320..78b5d47 100644 --- a/error_tracking_slog_test.go +++ b/error_tracking_slog_test.go @@ -178,3 +178,58 @@ func TestErrorExtractor_ExtractDescription(t *testing.T) { }) } } + +func TestSlogCaptureHandler_WithPropertiesFn(t *testing.T) { + next := &fakeNextSlogHandler{isEnabled: true} + client := &fakeEnqueueClient{} + ctx := context.Background() + + handler := NewSlogCaptureHandler(next, client, + WithMinCaptureLevel(slog.LevelWarn), + WithDistinctIDFn(func(_ context.Context, _ slog.Record) string { + return "test-user" + }), + WithPropertiesFn(func(_ context.Context, r slog.Record) Properties { + props := NewProperties() + r.Attrs(func(a slog.Attr) bool { + props.Set(a.Key, a.Value.Any()) + return true + }) + return props + }), + ) + + record := createLogRecord(slog.LevelError, "test error", + slog.String("environment", "production"), + slog.Int("retry_count", 3), + ) + + if err := handler.Handle(ctx, record); err != nil { + t.Fatalf("Handle returned error: %v", err) + } + + if len(client.enqueuedMsgs) != 1 { + t.Fatalf("expected 1 enqueued message, got %d", len(client.enqueuedMsgs)) + } + + exception, ok := client.enqueuedMsgs[0].(Exception) + if !ok { + t.Fatalf("expected Exception, got %T", client.enqueuedMsgs[0]) + } + + if exception.Properties == nil { + t.Fatal("expected Properties to be set") + } + + expectedProps := map[string]interface{}{ + "environment": "production", + "retry_count": int64(3), // note: slog.Int converts to int64 + } + + for key, expected := range expectedProps { + if exception.Properties[key] != expected { + t.Errorf("property %s: expected %v (type %T), got %v (type %T)", + key, expected, expected, exception.Properties[key], exception.Properties[key]) + } + } +} diff --git a/error_tracking_test.go b/error_tracking_test.go index 0a2ec0b..566edea 100644 --- a/error_tracking_test.go +++ b/error_tracking_test.go @@ -1,6 +1,7 @@ package posthog import ( + "encoding/json" "reflect" "testing" "time" @@ -116,3 +117,166 @@ func TestException_Validate(t *testing.T) { }) } } + +func TestException_APIfy_WithCustomProperties(t *testing.T) { + now := time.Now() + exList := []ExceptionItem{{Type: "Error", Value: "Something went wrong"}} + + tests := map[string]struct { + exception Exception + expected map[string]interface{} + }{ + "basic without custom properties": { + exception: Exception{DistinctId: "user-123", Timestamp: now, ExceptionList: exList}, + expected: map[string]interface{}{ + "$lib": SDKName, + "$lib_version": getVersion(), + "distinct_id": "user-123", + "$exception_list": exList, + }, + }, + "with custom properties and fingerprint": { + exception: Exception{ + DistinctId: "user-123", + Timestamp: now, + ExceptionFingerprint: ptrString("custom-fingerprint"), + Properties: NewProperties().Set("environment", "production").Set("retry_count", 3), + ExceptionList: exList, + }, + expected: map[string]interface{}{ + "$lib": SDKName, + "$lib_version": getVersion(), + "distinct_id": "user-123", + "$exception_list": exList, + "$exception_fingerprint": ptrString("custom-fingerprint"), + "environment": "production", + "retry_count": 3, + }, + }, + "custom properties override system properties": { + exception: Exception{ + DistinctId: "user-123", + Timestamp: now, + Properties: NewProperties().Set("$lib", "custom-lib").Set("distinct_id", "custom-id"), + ExceptionList: exList, + }, + expected: map[string]interface{}{ + "$lib": "custom-lib", + "$lib_version": getVersion(), + "distinct_id": "custom-id", + "$exception_list": exList, + }, + }, + } + + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + apiMsg, ok := tc.exception.APIfy().(ExceptionInApi) + if !ok { + t.Fatalf("expected ExceptionInApi, got %T", tc.exception.APIfy()) + } + + if !reflect.DeepEqual(apiMsg.Properties, Properties(tc.expected)) { + t.Errorf("properties mismatch\nexpected: %+v\ngot: %+v", tc.expected, apiMsg.Properties) + } + }) + } +} + +func TestNewDefaultException_WithProperties(t *testing.T) { + now := time.Now() + + t.Run("without properties", func(t *testing.T) { + exception := NewDefaultException(now, "user-123", "Error", "Description") + + if exception.Properties != nil { + t.Errorf("expected Properties to be nil, got %+v", exception.Properties) + } + }) + + t.Run("with properties using builder pattern", func(t *testing.T) { + props := NewProperties(). + Set("environment", "production"). + Set("custom_key", "custom_value") + + exception := NewDefaultException(now, "user-123", "Error", "Description"). + WithProperties(props) + + if exception.Properties == nil { + t.Error("expected Properties to be set") + } else if !reflect.DeepEqual(exception.Properties, props) { + t.Errorf("properties mismatch\nexpected: %+v\ngot: %+v", props, exception.Properties) + } + }) +} + +func ptrString(s string) *string { + return &s +} + +func marshalAndParseJSON(t *testing.T, exception Exception) (result map[string]interface{}, props map[string]interface{}) { + t.Helper() + + jsonBytes, err := json.Marshal(exception.APIfy()) + if err != nil { + t.Fatalf("marshal failed: %v", err) + } + + if err := json.Unmarshal(jsonBytes, &result); err != nil { + t.Fatalf("unmarshal failed: %v", err) + } + + props, ok := result["properties"].(map[string]interface{}) + if !ok { + t.Fatalf("properties field missing or wrong type") + } + + return result, props +} + +func TestException_JSONSerialization(t *testing.T) { + fingerprint := "custom-fingerprint-123" + exception := Exception{ + Type: "exception", + DistinctId: "user-123", + Timestamp: time.Date(2024, 11, 17, 10, 30, 0, 0, time.UTC), + Properties: NewProperties().Set("environment", "production").Set("custom_key", "custom_value"), + DisableGeoIP: true, + ExceptionFingerprint: &fingerprint, + ExceptionList: []ExceptionItem{{Type: "RuntimeError", Value: "Database connection failed"}}, + } + + result, props := marshalAndParseJSON(t, exception) + + tests := []struct { + obj map[string]interface{} + field string + expected interface{} + }{ + {result, "type", "exception"}, + {result, "event", "$exception"}, + {result, "library", SDKName}, + {result, "library_version", getVersion()}, + {props, "$lib", SDKName}, + {props, "$lib_version", getVersion()}, + {props, "distinct_id", "user-123"}, + {props, "$geoip_disable", true}, + {props, "$exception_fingerprint", "custom-fingerprint-123"}, + {props, "environment", "production"}, + {props, "custom_key", "custom_value"}, + } + + for _, tc := range tests { + if tc.obj[tc.field] != tc.expected { + t.Errorf("%s: expected %v, got %v", tc.field, tc.expected, tc.obj[tc.field]) + } + } + + exList, ok := props["$exception_list"].([]interface{}) + if !ok { + t.Errorf("$exception_list: expected []interface{}, got %T", props["$exception_list"]) + } + if len(exList) == 0 { + t.Errorf("$exception_list: expected non-empty list, got empty") + } +} diff --git a/examples/error_tracking.go b/examples/error_tracking.go index b63e8eb..0c503b8 100644 --- a/examples/error_tracking.go +++ b/examples/error_tracking.go @@ -3,10 +3,11 @@ package main import ( "context" "fmt" - "github.com/posthog/posthog-go" "log/slog" "os" "time" + + "github.com/posthog/posthog-go" ) func TestErrorTrackingThroughEnqueueing(projectAPIKey, endpoint string) { @@ -28,16 +29,50 @@ func TestErrorTrackingThroughEnqueueing(projectAPIKey, endpoint string) { return case <-tick: + // Capture an error / exception exception := posthog.NewDefaultException( time.Now(), "distinct-id", - "Enqueued error", + "Error title", "Error Description", ) if err := client.Enqueue(exception); err != nil { fmt.Println("error:", err) return } + + // Capture an exception with custom properties + exceptionWithProps := posthog.NewDefaultException( + time.Now(), + "distinct-id", + "Error title", + "Error Description", + ).WithProperties(posthog.NewProperties(). + Set("custom_property_a", "custom_value_a"). + Set("custom_property_b", "custom_value_b"), + ) + if err := client.Enqueue(exceptionWithProps); err != nil { + fmt.Println("error:", err) + return + } + + // Or use the Exception struct directly for full control + fullControlException := posthog.Exception{ + DistinctId: "distinct-id", + Properties: posthog.NewProperties(). + Set("custom_property_a", "custom_value_a"). + Set("custom_property_b", "custom_value_b"), + ExceptionList: []posthog.ExceptionItem{ + { + Type: "Error title", + Value: "Error description", + }, + }, + } + if err := client.Enqueue(fullControlException); err != nil { + fmt.Println("error:", err) + return + } } } } @@ -57,6 +92,15 @@ func TestErrorTrackingThroughLogHandler(projectAPIKey, endpoint string) { // for demo purposes, real applications should likely pull this value from the context. return "my-user-id" }), + // Extract custom properties from log attributes + posthog.WithPropertiesFn(func(ctx context.Context, r slog.Record) posthog.Properties { + props := posthog.NewProperties() + r.Attrs(func(a slog.Attr) bool { + props.Set(a.Key, a.Value.Any()) + return true + }) + return props + }), )) done := time.After(3 * time.Second) @@ -71,6 +115,8 @@ func TestErrorTrackingThroughLogHandler(projectAPIKey, endpoint string) { case <-tick: log.Warn("Log that something broke", "error", fmt.Errorf("this is a dummy scenario"), + "retry_count", 3, + "endpoint", "/api/v1/users", ) } } diff --git a/examples/examples b/examples/examples new file mode 100755 index 0000000..a8c5506 Binary files /dev/null and b/examples/examples differ diff --git a/go.mod b/go.mod index af71a93..281249d 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.21 require ( github.com/hashicorp/golang-lru/v2 v2.0.7 + github.com/joho/godotenv v1.5.1 github.com/stretchr/testify v1.10.0 github.com/urfave/cli v1.22.5 ) @@ -11,7 +12,6 @@ require ( require ( github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/joho/godotenv v1.5.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect diff --git a/version.go b/version.go index 214bdea..e7d1576 100644 --- a/version.go +++ b/version.go @@ -3,7 +3,7 @@ package posthog import "flag" // Version of the client. -const Version = "1.6.12" +const Version = "1.7.0" // make tests easier by using a constant version func getVersion() string {