Skip to content
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

[extension/jaegerremotesampling] remove jaeger sampling dependency #36977

Open
wants to merge 13 commits into
base: main
Choose a base branch
from

Conversation

ary82
Copy link

@ary82 ary82 commented Dec 28, 2024

Description

Copy the required code from jaeger to extension/jaegerremotesampling:

  • Modify files to remove dependencies
  • Add required code from plugin/sampling/strategyprovider/static
  • Add required code from cmd/collector/app/sampling to internal

Link to tracking issue

Fixes #36976

Testing

  • Add grpc_handler_test.go from cmd/collector/app/sampling/grpc_handler_test.go
  • Add provider_test.go from plugin/sampling/strategyprovider/static/provider_test.go with plugin/sampling/strategyprovider/static/fixtures

Copy link

linux-foundation-easycla bot commented Dec 28, 2024

CLA Signed

The committers listed above are authorized under a signed CLA.

Signed-off-by: Aryan Goyal <[email protected]>
Signed-off-by: Aryan Goyal <[email protected]>
Signed-off-by: Aryan Goyal <[email protected]>
@ary82 ary82 marked this pull request as ready for review December 29, 2024 14:36
@ary82 ary82 requested a review from a team as a code owner December 29, 2024 14:36
@ary82 ary82 requested a review from jpkrohling December 29, 2024 14:36
Copy link
Member

@yurishkuro yurishkuro left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The organization of the components needs to be improved, it's all over the place. I would recommend

internal/
  source/
    source.go - define interface
    filesource/ - define reading from file
    remotesource/ - a proxy that reads from a remote service
  server/
    grpc/ - grpc server that uses Source
    http/ - http server that uses Source and defines its own JSON model

// Flag for enabling possibly breaking change which includes default operations level
// strategies when calculating Ratelimiting type service level strategy
// more information https://github.com/jaegertracing/jaeger/issues/5270
IncludeDefaultOpStrategies bool
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this does not seem to be populated or used

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is used by the filesource(currently in newProvider in provider.go, will update the PR soon):

	if !h.options.IncludeDefaultOpStrategies {
		h.logger.Warn("Default operations level strategies will not be included for Ratelimiting service strategies." +
			"This behavior will be changed in future releases. " +
			"Cf. https://github.com/jaegertracing/jaeger/issues/5270")
		h.parseStrategies_deprecated(strategies)
	} else {
		h.parseStrategies(strategies)
	}

)

// Options holds configuration for the static sampling strategy store.
type Options struct {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if provider only takes two arguments I would just pass them directly without this extra struct

type strategyLoader func() ([]byte, error)

// newProvider creates a strategy store that holds static sampling strategies.
func newProvider(options Options, logger *zap.Logger) (internal.Provider, error) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

internal.Provider is an interface. You have two possible implementations, File and Remote. Calling this function newProvider when it's actually creating FileProvider is misleading

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also, the main Config calls this Source, so I would get rid of "provider" nomenclature altogether and have FileSource & RemoteSource (both should be in internal package)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense, I'll try and improve it

Copy link
Author

@ary82 ary82 Dec 30, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still need to clean up a bit before updating the PR, but here's the new internal package structure:

└── internal
    ├── mocks
    │   └── mock_source.go (Needed for grpc_test and http_test. Should I just include these in both the test files and skip making this package?)
    ├── server
    │   ├── grpc
    │   │   ├── grpc.go
    │   │   ├── grpc_handler.go
    │   │   ├── grpc_handler_test.go
    │   │   └── grpc_test.go
    │   └── http
    │       ├── http.go
    │       └── http_test.go
    └── source
        ├── interface.go
        ├── filesource
        │   ├── constants.go
        │   ├── fixtures/ (used for testing)
        │   ├── model.go
        │   ├── options.go
        │   ├── filesource.go (previously provider.go; newProvider will be renamed NewFileSource function that returns a source.Source)
        │   └── filesource_test.go
        └── remotesource
            ├── manager.go
            ├── manager_test.go
            ├── remote_strategy_cache.go
            ├── remote_strategy_cache_test.go
            └── remote_strategy_store.go (rename NewRemoteStrategyStore to NewRemoteSource, returns a source.Source)

extension/jaegerremotesampling/provider.go Outdated Show resolved Hide resolved

// strategy defines a sampling strategy. Type can be "probabilistic" or "ratelimiting"
// and Param will represent "sampling probability" and "max traces per second" respectively.
type strategy struct {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

where are these used? Do they need to be in the root package? It seems these define the data types for JSON output, so should be next to http server code.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think http uses the response from the Source interface's GetSamplingStrategy for the JSON output, which is github.com/jaegertracing/jaeger/proto-gen/api_v2.SamplingStrategyResponse.

This is used by the filesource to load the strategies

ary82 and others added 2 commits December 29, 2024 22:28
@yurishkuro
Copy link
Member

lgtm! Let's makes sure all CI checks are green.

@ary82 ary82 closed this Dec 30, 2024
@ary82 ary82 reopened this Dec 30, 2024
Signed-off-by: Aryan Goyal <[email protected]>
@ary82
Copy link
Author

ary82 commented Dec 30, 2024

Sorry, closing was a misclick on Close with comment
The CI showed errors on the linter. Here's what the linter says:

jaegerremotesampling/internal/source/filesource/filesource.go:378:12: Error return value of `enc.Encode` is not checked (errcheck)
	enc.Encode(*s)
	         ^
jaegerremotesampling/internal/source/filesource/filesource.go:380:12: Error return value of `dec.Decode` is not checked (errcheck)
	dec.Decode(&copyValue)
	         ^
jaegerremotesampling/internal/source/filesource/filesource_test.go:71:11: Error return value of `w.Write` is not checked (errcheck)
			w.Write([]byte("bad-content"))
			      ^
jaegerremotesampling/internal/source/filesource/filesource_test.go:85:11: Error return value of `w.Write` is not checked (errcheck)
			w.Write([]byte(*strategy.Load()))
			      ^
jaegerremotesampling/internal/source/filesource/filesource_test.go:512:17: Error return value of `os.WriteFile` is not checked (errcheck)
				os.WriteFile(snapshotFile, strategyJson, 0o644)
				           ^
jaegerremotesampling/internal/source/filesource/filesource_test.go:544:17: Error return value of `os.WriteFile` is not checked (errcheck)
				os.WriteFile(snapshotFile, strategyJson, 0o644)
				           ^
jaegerremotesampling/internal/source/filesource/filesource_test.go:371:21: G306: Expect WriteFile permissions to be 0600 or less (gosec)
	require.NoError(t, os.WriteFile(dstFile, srcBytes, 0o644))
	                  ^
jaegerremotesampling/internal/source/filesource/filesource_test.go:392:21: G306: Expect WriteFile permissions to be 0600 or less (gosec)
	require.NoError(t, os.WriteFile(dstFile, []byte(newStr), 0o644))
	                  ^
jaegerremotesampling/internal/source/filesource/filesource_test.go:469:21: G306: Expect WriteFile permissions to be 0600 or less (gosec)
	require.NoError(t, os.WriteFile(tempFile.Name(), []byte("bad value"), 0o644))
  • For the file permissions in filesource_test.go, should the permissions really be 600?
  • As for the errchecks in filesource in Encode and Decode, these are only used in the test and are safe to be ignored. Also should be moved to the test file(edit: fixed)

@yurishkuro
Copy link
Member

For the file permissions in filesource_test.go, should the permissions really be 600?

600 permission should be fine

As for the errchecks in filesource in Encode and Decode, these are only used in the test and are safe to be ignored. Also should be moved to the test file(edit: fixed)

There's rarely a good reason to ignore errors, even in tests - at some point something might break, and ignored error makes it harder to debug. You can always add require.NoError(t, err) in tests.

@ary82
Copy link
Author

ary82 commented Dec 30, 2024

Thanks for your help :) Should be fixed now

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Remove extension/jaegerremotesampling dependency on JAEGER/cmd/collector/app/sampling
3 participants