blob: 8ce02d8c8e458fb2d9e4b3612cd7dd8e8412f1f1 [file] [log] [blame] [view]
This directory contains the backend service implementation and it's respective controllers.
The backend service is intended to host api endpoints that are not directly user facing.
This helps isolate user facing components from the other services running in the cluster by
providing a standard interface contract that calling services can adhere to. For example, to run
manual pinpoint jobs from the UI, the frontend service can invoke the endpoint on the backend
service. The backend endpoint will trigger the workflow in the temporal cluster. In the future if
we replace temporal with another solution, the contract between frontend (and any other service
that invokes this endpoint) remains unchanged and makes the code easy to upgrade. This service can
also be used to lighten the load on the frontend service by offloading some heavier operations
(eg: Dry run regression detection) that are currently being run in frontend to the backend service.
# Running the backend service locally
To run a local instance of the backend service, simply run the cmd below from the [perf](../../)
directory.
`make run-demo-backend`
# Adding a new endpoint
The endpoint controllers are all in the `controllers` directory. To add a new endpoint, please
follow the steps below. A sample `hello` endpoint is provided for reference.
1. Create a new proto definition defining your service. This need not be under this directory and
can reside in a location specific to your implementation.
Eg: [culprit_service.proto](../culprit/proto/v1/culprit_service.proto).
2. Create a generate.go file that provides the generation script to create the stubbed
client/server code for your service. Eg:
[generate.go](../culprit/proto/v1/generate.go). Replace the arguments on the
`//:protoc` command to specify your module and input proto file appropriately.
Running `go generate ./...` in the location of this file will generate the stubs.
3. Create your endpoint controller by implementing implement the `backend.BackendService` interface.
Eg: [culprit service](../culprit/service/service.go)
4. Add the newly added service to the list in `initialize()` function in [backend.go](backend.go).
The endpoints are simple grpc apis, so you can either create a client for the specific endpoint
using the stubs, or use a tool like [grpc_cli](http://go/grpc_cli).
# Checking available endpoints
`grpc_cli ls [::]:8005 --channel_creds_type=local`
# Invoking an endpoint locally
`grpc_cli call [::]:8005 --channel_creds_type=local backend.v1.Hello.SayHello "text: 'World'"`
# Creating Go clients for your service
In order to make the grpc connections uniform across the services, we have created a
[backendclientutility](client/backendclientutil.go) to abstract out the GRPC boilerplate
and make it easy to create clients for individual services. If you are adding a new service,
simply follow the pattern in this file to create a function to create the client for your service.
# URL for the Backend Service
For local deployments, you can simply use `localhost:8005` (double check the value specified
in [demo.json](../../configs/demo.json)).
For production or GKE deployment of the Backend service, we use Kubernetes DNS. Since the endpoints
on this service are intended to be internal S2S calls only, we are not opening up external DNS
to the service. Instead we can use the service cluster url
(eg: `perf-be-chrome-non-public.perf.svc.cluster.local:7000`) to invoke the BE kubernetes workload.
The service name and port will be different for each instance, so please refer to the table below
to get the url for the instance you want.
| Instance | URL |
| ----------------- | ----------------------------------------------------- |
| Chrome (Internal) | perf-be-chrome-non-public.perf.svc.cluster.local:7000 |