Skip to content

Publishing results

Josh Hiles edited this page Dec 22, 2023 · 1 revision

What good is science if you can't publish your results?

By default results are published in an in-memory publisher. To override this behavior, create your own implementation of IResultPublisher:

public class MyResultPublisher : IResultPublisher
{
    public Task Publish<T, TClean>(Result<T, TClean> result)
    {
        Logger.Debug($"Publishing results for experiment '{result.ExperimentName}'");
        Logger.Debug($"Result: {(result.Matched ? "MATCH" : "MISMATCH")}");
        Logger.Debug($"Control value: {result.Control.Value}");
        Logger.Debug($"Control duration: {result.Control.Duration}");
        foreach (var observation in result.Candidates)
        {
            Logger.Debug($"Candidate name: {observation.Name}");
            Logger.Debug($"Candidate value: {observation.Value}");
            Logger.Debug($"Candidate duration: {observation.Duration}");
        }

        if (result.Mismatched)
        {
            // saved mismatched experiments to DB
            DbHelpers.SaveExperimentResults(result);
        }

        return Task.FromResult(0);
    }
}

Then set Scientist to use it before running the experiments:

Scientist.ResultPublisher = new MyResultPublisher();

As of v1.0.2, A IResultPublisher can also be wrapped in FireAndForgetResultPublisher so that result publishing avoids any delays in running experiments and is delegated to another thread:

Scientist.ResultPublisher = new FireAndForgetResultPublisher(new MyResultPublisher(onPublisherException));

Clone this wiki locally