caffeine
 
Caffeine is a compiler for generating reliability artifacts from service expectation definitions.
Installation
We recommend using within a CICD pipeline.
Within a GitHub Actions workflow, you can use the following action:
- name: Caffeine Language GitHub Action
  uses: Brickell-Research/caffeine_lang_github_action@vmain
See the action in the Github Actions Marketplace.
Architecture & RFCs
For detailed architectural decisions and design proposals, see our RFCs directory:
- RFC 001: Extensible Architecture - Core architectural principles and design patterns
- RFC 002: Caffeine Query Language - The Caffeine Query Language (CQL)
Quick Start
Projects are structured as follows:
some_organization/
├── platform/
│   └── reliable_service.yaml
├── frontend/
│   └── unreliable_service.yaml
├── specifications/
    ├── basic_types.yaml
    ├── query_template_types.yaml
    ├── services.yaml
    └── sli_types.yaml
Here we have two types of files, instantiation and specification.
Instantiation
Instantiation: define the SLO(s) for a service. Each service defines one or more SLOs in a yaml file with the name of the file being the name of the service and the parent directory being the name of the owning team.
As an example, platform/reliable_service.yaml:
slos:
  - sli_type: "http_requests_success_rate"
    typed_instatiation_of_query_templatized_variables:
      "peer_hostname": "api.google.com"
      "environment": "production"
      "http_status_codes": "[200, 201, 202, 204]"
    threshold: 99.0
    window_in_days: 90
Here threshold and window_in_days are always required, sli_type refers to an sli type from the specification and typed_instatiation_of_query_templatized_variables is a series of mappings between expected attributes for the sli type and their values.
Specification
Specification: define the templates available for defining SLI(s).
There are four types of specifications to define.
(1) basic types: a mapping of attribute names to the expected type. These are names of expected parameters used by other parts of the specification.
Example:
basic_types:
  - attribute_name: peer_hostname
    attribute_type: String
  - attribute_name: environment
    attribute_type: String
  - attribute_name: http_status_codes
    attribute_type: List(Integer)
(2) query template types: a definition of a query template type. The query is a CQL expression and the specification of query templates is a list of basic type names that are expected to be used in the query.
Example:
query_template_types:
  - name: "valid_over_total"
    specification_of_query_templates: ["peer_hostname", "environment"]
    query: "numerator / denominator"
(3) services: a mapping of service names to supported sli types.
Example:
services:
  - name: reliable_service
    sli_types:
      - http_requests_success_rate
(4) sli types: a definition of an SLI type that combines a query template type with specific query instantiations and the required templatized variables.
Example:
types:
  - name: http_requests_success_rate
    query_template_type: valid_over_total
    typed_instatiation_of_query_templates:
      numerator: "sum.http_requests.hits{peer.hostname:$$peer_hostname$$ AND env:$$environment$$ AND http.status_code IN $$http_status_codes$$}.as_count()"
      denominator: "sum.http_requests.hits{peer.hostname:$$peer_hostname$$ AND env:$$environment$$}.as_count()"
    specification_of_query_templatized_variables:
      - peer_hostname
      - environment
      - http_status_codes
Once all of this is defined, execute the compiler as follows:
compiler.compile("some_organization/specifications", "some_organization", "some_output_dir")
License
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.