prebid / prebid-server

Open-source solution for running real-time advertising auctions in the cloud.
https://prebid.org/product-suite/prebid-server/
Apache License 2.0
435 stars 744 forks source link

Modules and execution plans #3880

Open bretg opened 3 months ago

bretg commented 3 months ago

Having more modules is great, but we've found that execution plans are more difficult to manage than they could be.

So we'd like to propose the following:

We discussed having core be aware of the enabled flag, but currently the module config is opaque to PBS-core. It could cause duplicate parsing of config JSON. It would be an upgrade of the module infrastructure to support a core-visible enabled flag.

PBS-Go reads the module config from the merged config, looking for an enabled flag.

We agreed to consider this offline and continue the discussion in this issue.

bretg commented 2 months ago

Discussed these options:

  1. Do nothing.
  2. PBS-core could start requiring module config in order to call the module. Even empty config. If such module config exists, the module is considered enabled.
  3. Have core look for an enabled flag and just don't bother calling the module.
  4. Establish a review convention that all modules must support an enabled flag and the first this every module hook does is confirm enablement.

We're leaning heavily towards option 2:

We'll bring this up again at next weeks meeting, hopefully for the final time.

bretg commented 1 month ago

We did meet last meeting and confirm Option 2 as detailed above.

bretg commented 1 day ago

As the team has been building this feature in PBS-Java, I've been corrected on a misunderstanding and we've added a feature.

  1. host-level config in PBS-Java is the application.yaml file. Module config here is used only in initialization, not at runtime. So even if a module here has config, it won't be seen as runtime configuration.
  2. A workaround would be to place empty module config in the default-account-config, but the team found this unappealing.
  3. So we're adding a hooks.admin.module-execution option that will allow the host company to define and override which execution plans get called. This is meant to be defines in the default account config and can be overridden for each account, providing a good deal of flexibility in controlling which modules run for each account.

Here's an example with expected behavior.

The application.yaml host-level config contains the execution plans for 4 modules, but modules 1 and 2 don't need any configuration. Pseudo-code:

settings:
  modules:
    require-config-to-invoke: true
execution-plan:
  processed-auction:
    group 1:
      execute module 1
      execute module 2
    group 2:
      execute module 3
  all-processed-bid-responses:
    group 1:
      execute module 4

Default account config:

{
  hooks: {
    admin: {
      module-execution: {  // instead of defining blank global config
        "module1": true             
        "module2": true
      }
   }
}

Account-level config:

Expected results:

  1. module 1 is called for both accounts A and B because the default account config set it to true even through there's no config.
  2. module 2 is called for account B only because A overrode it to false.
  3. module 3 is called for account A only
  4. module 4 is called for account B only