blob: d7f75ed10811ea7ab6a4ac58142181918e66018d [file] [view]
---
id: functions-develop-user-defined-configs
title: Pass user-defined configurations
sidebar_label: "Pass user-defined configurations"
description: Learn to pass user-defined configurations to a function in Pulsar.
---
````mdx-code-block
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
````
When you run or update functions created via SDK, you can pass arbitrary key/value pairs to them by using CLI with the `--user-config` flag. Key/value pairs must be specified as JSON.
````mdx-code-block
<Tabs groupId="lang-choice"
defaultValue="Java"
values={[{"label":"Java","value":"Java"},{"label":"Python","value":"Python"},{"label":"Go","value":"Go"}]}>
<TabItem value="Java">
:::note
For all key/value pairs passed to Java functions, both keys and values are `string`. To set the value to be a different type, you need to deserialize it from the `string` type.
:::
The context object of Java SDK enables you to access key/value pairs provided to Pulsar Functions via CLI (as JSON). The following example passes a key/value pair.
```bash
bin/pulsar-admin functions create \
# Other function configs
--user-config '{"word-of-the-day":"verdure"}'
```
To access that value in a Java function:
```java
import org.apache.pulsar.functions.api.Context;
import org.apache.pulsar.functions.api.Function;
import org.slf4j.Logger;
import java.util.Optional;
public class UserConfigFunction implements Function<String, Void> {
@Override
public void apply(String input, Context context) {
Logger LOG = context.getLogger();
Optional<String> wotd = context.getUserConfigValue("word-of-the-day");
if (wotd.isPresent()) {
LOG.info("The word of the day is {}", wotd);
} else {
LOG.warn("No word of the day provided");
}
return null;
}
}
```
The `UserConfigFunction` function logs the string `"The word of the day is verdure"` every time the function is invoked. The `word-of-the-day` config can be changed only when the function is updated with a new value via the CLI.
You can also access the entire user config map or set a default value in case no value is present.
```java
// Get the whole config map
Map<String, String> allConfigs = context.getUserConfigMap();
// Get value or resort to default
String wotd = context.getUserConfigValueOrDefault("word-of-the-day", "perspicacious");
```
</TabItem>
<TabItem value="Python">
In a Python function, you can access the configuration value like this.
```python
from pulsar import Function
class WordFilter(Function):
def process(self, context, input):
forbidden_word = context.user_config()["forbidden-word"]
# Don't publish the message if it contains the user-supplied
# forbidden word
if forbidden_word in input:
pass
# Otherwise publish the message
else:
return input
```
The context object of Python SDK enables you to access key/value pairs provided to functions via the command line (as JSON). The following example passes a key/value pair.
```bash
bin/pulsar-admin functions create \
# Other function configs \
--user-config '{"word-of-the-day":"verdure"}'
```
To access that value in a Python function:
```python
from pulsar import Function
class UserConfigFunction(Function):
def process(self, input, context):
logger = context.get_logger()
wotd = context.get_user_config_value('word-of-the-day')
if wotd is None:
logger.warn('No word of the day provided')
else:
logger.info("The word of the day is {0}".format(wotd))
```
</TabItem>
<TabItem value="Go">
The context object of Go SDK enables you to access key/value pairs provided to functions via the command line (as JSON). The following example passes a key/value pair.
```bash
bin/pulsar-admin functions create \
--go path/to/go/binary
--user-config '{"word-of-the-day":"lackadaisical"}'
```
To access that value in a Go function:
```go
func contextFunc(ctx context.Context) {
fc, ok := pf.FromContext(ctx)
if !ok {
logutil.Fatal("Function context is not defined")
}
wotd := fc.GetUserConfValue("word-of-the-day")
if wotd == nil {
logutil.Warn("The word of the day is empty")
} else {
logutil.Infof("The word of the day is %s", wotd.(string))
}
}
```
</TabItem>
</Tabs>
````