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

PBS-Go: Use global objects through shims to be able to swap implementations #4084

Open
justadreamer opened this issue Dec 4, 2024 · 0 comments
Labels

Comments

@justadreamer
Copy link
Contributor

justadreamer commented Dec 4, 2024

Note: This is PBS-Go-specific. Proof-of-concept PR: #4085

Motivation

Be able to swap dependencies to test and customize behaviors.

Rationale

The primary use case that can benefit from this is logging. prebid-server code makes direct calls to glog.Warningf, glog.Errorf. This is a side-effectful behavior that depends on glog package. It would be useful to encapsulate it behind some common logging interface facade to be able to replace glog with another logger in compile time to a) be able to test b) f.e. use other logger s.a. slog

The example of how it can benefit testing is given as part of solving this issue: #3748 with this PR: #3829. The issue specifically complains that there is undesirable logging happening and it would be nice to remove it. To actually test that it has been removed - we need to inject a different logger during testing - this is done using an interface and instance provided in di/logger.go and tests instantiating a different instance in runtime.

Another example is that if logger is encapsulated - we will be able to easily swap the glog with slog f.e. for the use case described here: #4062

Mechanism

Currently this is only done for logger object under logger package.
logger/interface.go defines the interface. The providers (implementers of the interface) are logger/default.go and logger/alternative.go - one of them can be compile-time enabled (using build tags). The provider is instantiated in logger/logger.go. Alternative implementation of logger can be built with a tag custom_logger likego build -tags custom_logger.

The call site will simply replace glog.X call with logger.Log.X.

Proof-of-concept

PR: #4085

@bretg bretg closed this as completed Dec 4, 2024
@bretg bretg reopened this Dec 6, 2024
@bretg bretg added the PBS-Go label Dec 6, 2024
@bretg bretg moved this from Triage to In Progress in Prebid Server Prioritization Dec 6, 2024
@justadreamer justadreamer changed the title PBS-Go: Lightweight compile-time dependency injection mechanism PBS-Go: Use global objects through shims to be able to swap implementations Jan 13, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: In Progress
Development

No branches or pull requests

2 participants