Local¶
Run Locally¶
Running your functions locally for testing and debugging is easy to do with the goblet command goblet local.
You can hit your functions endpoint at localhost:8080
.
You can have a custom local name by setting the local param in the goblet class
from goblet import Goblet
app = Goblet(function_name="goblet_example", local='test')
Then run goblet local test
Note: If you have both http() and route(“/”) in order to test the route locally make sure to add the header X-Envoy-Original-Path
. Otherwise the route will default to @http()
curl localhost:8080/endpoint
The goblet app will run on port 8080 by default. You can specify a custom port with the -p
flag.
goblet local -p 6000
You can set environment variables defined in your config.json locally by passing in the –set-env flag. Note that this will pass through environment variables set in a stage as well if you specify the –stage flag.
goblet local --set-env --stage dev
Building and Running locally using Docker¶
Make sure Docker Desktop and Docker CLI is installed, more information located here: <https://docs.docker.com/desktop/>
Refresh local credentials by running: gcloud auth application-default login
Set the GOOGLE_APPLICATION_CREDENTIALS variable by running: export GOOGLE_APPLICATION_CREDENTIALS=~/.config/gcloud/application_default_credentials.json
To build container run: docker build . -t <tag>
To start container run:
docker run -p 8080:8080 \
-v ~/.config/gcloud/application_default_credentials.json:/tmp/application_default_credentials.json:ro \
-e GOOGLE_APPLICATION_CREDENTIALS=/tmp/application_default_credentials.json \
-e GCLOUD_PROJECT=<gcp-project> <tag>:latest
Installing private packages during Docker Build¶
To install a private package located with GCP Artifact Registry, credentials will need to be mounted during the build process. Add this line to Dockerfile before requirements install:
RUN --mount=type=secret,id=gcloud_creds,target=/app/google_adc.json export GOOGLE_APPLICATION_CREDENTIALS=/app/google_adc.json \
&& pip install -r requirements.txt
To build container run: docker build . –secret id=gcloud_creds,src=”$GOOGLE_APPLICATION_CREDENTIALS” -t <tag>
Scheduled Job¶
To test a scheduled job locally you will need to include two headers in your request. One X-Goblet-Type:schedule
and
X-Goblet-Name:FUNCTION_NAME
which is the name of your function.
curl -H X-Goblet-Type:schedule -H X-Goblet-Name:FUNCTION_NAME localhost:8080
Pubsub¶
To test a pubsub topic locally you will need to include the subscription in the payload as well as a base64 encoded string for the body.
{
"subscription": "TOPIC_NAME",
"body": base64.b64encode(json.dumps({"key":"value"}).encode())
}
Pubsub Emulator¶
Google has a pubsub emulator that you can use to test your pubsub functions locally. You can install and run the emulator with gcloud as shown in the docs here. Or if you prefer you can also use docker. There’s a Dockerfile and docker-compose.yml files on the examples to run the emulator: .. code:: yaml
- services:
- pubsub-emulator:
- build:
context: . dockerfile: pubsub-emulator.Dockerfile
- ports:
“8085:8085”
Run the emulator with docker-compose up
. Then set the environment variables PUBSUB_EMULATOR_HOST=localhost:8085
and GOBLET_LOCAL_URL=http://host.docker.internal:8080
to use the emulator with goblet. You can run goblet local –extras to deploy topics and subscriptions to the emulator and also start a local function that listens to the subscription messages.
Cloud Task¶
To test a cloudtask locally you will need to add the User-Agent:Google-Cloud-Tasks
and X-Goblet-CloudTask-Target:TARGET
headers
curl -H X-Goblet-CloudTask-Target:TARGET -H User-Agent:Google-Cloud-Tasks localhost:8080
Eventarc¶
To test an eventarc event locally you will need to add Ce-Type
and Ce-Source
headers
curl -H Ce-Type:google.cloud.pubsub.topic.v1.messagePublished -H Ce-Sourc://pubsub.googleapis.com/projects/goblet/topics/test localhost:8080
Cloudrun Job¶
To test a cloudrun job locally you can run goblet job run APP_NAME-JOB_NAME TASK_ID
BQ Remote Function¶
To test an bqremotefunction locally you will need to add a userDefinedContext
field to the body with a X-Goblet-Name
field with the format of APP_NAME
_ FUNCTION_NAME
.
You pass in the arguments to you function in a list in the calls
field.
{
"userDefinedContext": {
"X-Goblet-Name": "bqremotefunction_test_function_test"
},
"calls": [[2, 2], [3, 3]],
}
Log Levels¶
You can set the log level by passing in the environent variable GOBLET_LOG_LEVEL. By default the log level is INFO. You can set the level to DEBUG by passing –debug after any goblet command.
goblet --debug package
Debugging with VScode¶
To debug your functions locally with Vscode you can use the following configuration. Replace LOCAL_NAME with the name you
passed into goblet(NAME, local=LOCAL_NAME)
. Make sure that there are no naming collisions with any function names used in your app.
{
"configurations": [
{
"name": "Python: Module",
"type": "python",
"request": "launch",
"module": "functions_framework",
"args": [
"--target",
"LOCAL_NAME",
"--debug"
]
}
]
}