diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6fe753af..ce86b71d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -39,7 +39,7 @@ jobs: env: FOSSA_API_KEY: ${{ secrets.FOSSA_API_KEY }} - name: upload THIRDPARTY file - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: THIRDPARTY path: /tmp/THIRDPARTY @@ -158,7 +158,7 @@ jobs: run: | make testall - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: splunk-firehose-nozzle path: splunk-firehose-nozzle @@ -198,7 +198,7 @@ jobs: ruby-version: ${{ env.RUBY_VERSION }} - run: ruby -v - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: splunk-firehose-nozzle @@ -253,7 +253,7 @@ jobs: go-version: ${{ env.GO_VERSION }} - run: go version - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: splunk-firehose-nozzle @@ -267,7 +267,7 @@ jobs: echo "tile_name=$(ls tile/product | grep ".pivotal")" >> "$GITHUB_ENV" - name: Upload tile - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: ${{ env.tile_name }} path: tile/product/${{ env.tile_name }} @@ -312,7 +312,7 @@ jobs: ruby-version: ${{ env.RUBY_VERSION }} - run: ruby -v - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: splunk-firehose-nozzle diff --git a/README.md b/README.md index 1402fb5d..4e0dd257 100644 --- a/README.md +++ b/README.md @@ -88,32 +88,32 @@ __Advanced Configuration Features:__ This is recommended for dev environments only. (Default: false) * `SKIP_SSL_VALIDATION_SPLUNK`: Skips SSL certificate validation for connection to Splunk. Secure communications will not check SSL certificates against a trusted certificate authority. (Default: false) This is recommended for dev environments only. -* `FIREHOSE_SUBSCRIPTION_ID`: Tags nozzle events with a Firehose subscription id. See https://docs.pivotal.io/pivotalcf/1-11/loggregator/log-ops-guide.html. (Default: splunk-firehose) +* `FIREHOSE_SUBSCRIPTION_ID`: Tags nozzle events with a Firehose subscription id. See https://docs.vmware.com/en/VMware-Tanzu-Application-Service/6.0/tas-for-vms/log-ops-guide.html. (Default: splunk-firehose) * `FIREHOSE_KEEP_ALIVE`: Keep alive duration for the Firehose consumer. (Default: 25s) * `ADD_APP_INFO`: Enrich raw data with app info. A comma separated list of app metadata (AppName,OrgName,OrgGuid,SpaceName,SpaceGuid). (Default: "") * `ADD_TAGS`: Add additional tags from envelope to splunk event. (Default: false) - (Please note: Adding tags / Enabling this feature may slightly impact the performance due to the increased event size) + (Please note: Enabling this feature may slightly impact the performance due to the increased event size) * `IGNORE_MISSING_APP`: If the application is missing, then stop repeatedly querying application info from Cloud Foundry. (Default: true) * `MISSING_APP_CACHE_INVALIDATE_TTL`: How frequently the missing app info cache invalidates (in s/m/h. For example, 3600s or 60m or 1h). (Default: 0s) (see below for more details) * `APP_CACHE_INVALIDATE_TTL`: How frequently the app info local cache invalidates (in s/m/h. For example, 3600s or 60m or 1h). (Default: 0s) (see below for more details) * `ORG_SPACE_CACHE_INVALIDATE_TTL`: How frequently the org and space cache invalidates (in s/m/h. For example, 3600s or 60m or 1h). (Default: 72h) * `APP_LIMITS`: Restrict to APP_LIMITS the most updated apps per request when populating the app metadata cache. keep it 0 to update all the apps. (Default: 0) * `BOLTDB_PATH`: Bolt database path. (Default: cache.db) -* `EVENTS`: A comma separated list of events to include. It is a required field. Possible values: ValueMetric,CounterEvent,Error,LogMessage,HttpStartStop,ContainerMetric. If no eventtype is selected, nozzle will automatically select LogMessage to keep the nozzle running. (Default: "ValueMetric,CounterEvent,ContainerMetric") +* `EVENTS`: A comma separated list of events to include. It is a required field. Possible values: ValueMetric,CounterEvent,Error,LogMessage,HttpStartStop,ContainerMetric. If no event type is selected, nozzle will automatically select LogMessage to keep the nozzle running. (Default: "ValueMetric,CounterEvent,ContainerMetric") * `EXTRA_FIELDS`: Extra fields to annotate your events with (format is key:value,key:value). (Default: "") -* `FLUSH_INTERVAL`: Time interval (in s/m/h. For example, 3600s or 60m or 1h) for flushing queue to Splunk regardless of CONSUMER_QUEUE_SIZE. Protects against stale events in low throughput systems. (Default: 5s) +* `FLUSH_INTERVAL`: Time interval (in s/m/h. For example, 3600s or 60m or 1h) for flushing queue to Splunk regardless of `CONSUMER_QUEUE_SIZE`. Protects against stale events in low throughput systems. (Default: 5s) * `CONSUMER_QUEUE_SIZE`: Sets the internal consumer queue buffer size. Events will be pushed to Splunk after queue is full. (Default: 10000) * `HEC_BATCH_SIZE`: Set the batch size for the events to push to HEC (Splunk HTTP Event Collector). (Default: 100) * `HEC_RETRIES`: Retry count for sending events to Splunk. After expiring, events will begin dropping causing data loss. (Default: 5) * `HEC_WORKERS`: Set the amount of Splunk HEC workers to increase concurrency while ingesting in Splunk. (Default: 8) * `ENABLE_EVENT_TRACING`: Enables event trace logging. Splunk events will now contain a UUID, Splunk Nozzle Event Counts, and a Subscription-ID for Splunk correlation searches. (Default: false) -* `SPLUNK_LOGGING_INDEX`: The Splunk index where logs from the nozzle of the sourcetype `cf:splunknozzle` will be sent to. Warning: Setting an invalid index will cause events to be lost. This index must match one of the selected indexes for the Splunk HTTP event collector token used for the SPLUNK_TOKEN parameter. When not provided, all logging events will be forwarded to the default SPLUNK_INDEX. The default value is `""` -* `STATUS_MONITOR_INTERVAL`: Time interval (in s/m/h. For example, 3600s or 60m or 1h) for Enabling Monitoring (Metric data of insights with in the connectors). Default is 0s (Disabled). +* `SPLUNK_LOGGING_INDEX`: The Splunk index where logs from the nozzle of the sourcetype `cf:splunknozzle` will be sent to. Warning: Setting an invalid index will cause events to be lost. This index must match one of the selected indexes for the Splunk HTTP event collector token used for the SPLUNK_TOKEN parameter. When not provided, all logging events will be forwarded to the default SPLUNK_INDEX. (Default: "") +* `STATUS_MONITOR_INTERVAL`: Time interval (in s/m/h. For example, 3600s or 60m or 1h) to enable monitoring of metric data within the connector. (This increases CPU load and should be used only for insights purposes. Default: 0s). * `SPLUNK_METRIC_INDEX`: Index in which metric data will be ingested when monitoring module is enabled * `SELECTED_MONITORING_METRICS`: Name of the metrics that you want to monitor and add using comma seprated values. List of the metrics that are supported in the metrics modules are given below * `REFRESH_SPLUNK_CONNECTION`: If set to true, PCF will periodically refresh connection to Splunk (how often depends on KEEP_ALIVE_TIMER value). If set to false connection will be kept alive and reused. (Default: false) -* `KEEP_ALIVE_TIMER`: Time after which connection to Splunk will be refreshed, if REFRESH_SPLUNK_CONNECTION is set to true (in s/m/h. For example, 3600s or 60m or 1h). (Default: 30s) -* `MEMORY_BALLAST_SIZE`: Size of memory allocated to reduce GC cycles. Default is 0, Size should be less than the total memory. +* `KEEP_ALIVE_TIMER`: Time after which connection to Splunk will be refreshed, if `REFRESH_SPLUNK_CONNECTION` is set to true (in s/m/h. For example, 3600s or 60m or 1h). (Default: 30s) +* `MEMORY_BALLAST_SIZE`: Size of memory allocated to reduce GC cycles. Size should be less than the total memory. (Default: 0). __About app cache params:__ @@ -418,7 +418,7 @@ A correct setup logs a start message with configuration parameters of the Nozzle skip-ssl: true splunk-host: http://localhost:8088 splunk-index: atomic - subscription-id: splunk-firehose + firehose-subscription-id: splunk-firehose trace-logging: true status-monitor-interval: 0s version: @@ -487,7 +487,7 @@ sourcetype="cf:counterevent" ### 7. Nozzle is not collecting any data with 'websocket' (bad handshake) error -If the nozzle reports below error, then check if the configured "subscription-id" has '#' as a prefix. Please remove the prefix or prepend any other character than '#' to fix this issue. +If the nozzle reports below error, then check if the configured "firehose-subscription-id" has '#' as a prefix. Please remove the prefix or prepend any other character than '#' to fix this issue. ``` Error dialing trafficcontroller server: websocket: bad handshake.\nPlease ask your Cloud Foundry Operator to check the platform configuration (trafficcontroller is wss://****:443). ``` diff --git a/eventsink/splunk.go b/eventsink/splunk.go index 18331dfe..dd9cd34b 100644 --- a/eventsink/splunk.go +++ b/eventsink/splunk.go @@ -245,7 +245,7 @@ func (s *Splunk) buildEvent(fields map[string]interface{}) map[string]interface{ if s.config.TraceLogging { extraFields["nozzle-event-counter"] = strconv.FormatUint(atomic.AddUint64(&s.eventCount, 1), 10) - extraFields["subscription-id"] = s.config.SubscriptionID + extraFields["firehose-subscription-id"] = s.config.SubscriptionID extraFields["uuid"] = s.config.UUID } for k, v := range s.config.ExtraFields { diff --git a/splunknozzle/config.go b/splunknozzle/config.go index 32e823d3..3d089c8f 100644 --- a/splunknozzle/config.go +++ b/splunknozzle/config.go @@ -27,7 +27,7 @@ type Config struct { SkipSSLCF bool `json:"skip-ssl-cf"` SkipSSLSplunk bool `json:"skip-ssl-splunk"` - SubscriptionID string `json:"subscription-id"` + SubscriptionID string `json:"firehose-subscription-id"` KeepAlive time.Duration `json:"keep-alive"` AddAppInfo string `json:"add-app-info"` @@ -99,7 +99,7 @@ func NewConfigFromCmdFlags(version, branch, commit, buildos string) *Config { OverrideDefaultFromEnvar("SKIP_SSL_VALIDATION_CF").Default("false").BoolVar(&c.SkipSSLCF) kingpin.Flag("skip-ssl-validation-splunk", "Skip cert validation (for dev environments"). OverrideDefaultFromEnvar("SKIP_SSL_VALIDATION_SPLUNK").Default("false").BoolVar(&c.SkipSSLSplunk) - kingpin.Flag("subscription-id", "Id for the subscription."). + kingpin.Flag("firehose-subscription-id", "Id for the subscription."). OverrideDefaultFromEnvar("FIREHOSE_SUBSCRIPTION_ID").Default("splunk-firehose").StringVar(&c.SubscriptionID) kingpin.Flag("firehose-keep-alive", "Keep Alive duration for the firehose consumer"). OverrideDefaultFromEnvar("FIREHOSE_KEEP_ALIVE").Default("25s").DurationVar(&c.KeepAlive) @@ -141,7 +141,7 @@ func NewConfigFromCmdFlags(version, branch, commit, buildos string) *Config { kingpin.Flag("keep-alive-timer", "Interval used to close and refresh connection to Splunk"). OverrideDefaultFromEnvar("KEEP_ALIVE_TIMER").Default("30s").DurationVar(&c.KeepAliveTimer) - kingpin.Flag("enable-event-tracing", "Enable event trace logging: Adds splunk trace logging fields to events. uuid, subscription-id, nozzle event counter"). + kingpin.Flag("enable-event-tracing", "Enable event trace logging: Adds splunk trace logging fields to events. uuid, firehose-subscription-id, nozzle event counter"). OverrideDefaultFromEnvar("ENABLE_EVENT_TRACING").Default("false").BoolVar(&c.TraceLogging) kingpin.Flag("debug", "Enable debug mode: forward to standard out instead of splunk"). OverrideDefaultFromEnvar("DEBUG").Default("false").BoolVar(&c.Debug) diff --git a/splunknozzle/config_test.go b/splunknozzle/config_test.go index bc37869f..188b62fa 100644 --- a/splunknozzle/config_test.go +++ b/splunknozzle/config_test.go @@ -171,7 +171,7 @@ var _ = Describe("Config", func() { "--job-host=nozzle.example.comc", "--skip-ssl-validation-cf", "--skip-ssl-validation-splunk", - "--subscription-id=my-nozzlec", + "--firehose-subscription-id=my-nozzlec", "--firehose-keep-alive=24s", "--add-app-info=OrgName", "--ignore-missing-app", diff --git a/testing/integration/testcases/test_nozzle_configurations.py b/testing/integration/testcases/test_nozzle_configurations.py index 4cd92ac2..5c01e45d 100644 --- a/testing/integration/testcases/test_nozzle_configurations.py +++ b/testing/integration/testcases/test_nozzle_configurations.py @@ -21,7 +21,7 @@ def test_search_event_on_splunk_is_not_empty(self, test_env, splunk_logger): @pytest.mark.Critical @pytest.mark.parametrize("query_input", [ "index={} cf_app_name=data_gen nozzle-event-counter>0", # nozzle-event-counter should be searchable - "index={} cf_app_name=data_gen subscription-id::splunk-ci", # subscription-id should be searchable + "index={} cf_app_name=data_gen firehose-subscription-id::splunk-ci", # subscription-id should be searchable "index={} cf_app_name=data_gen uuid::*" # uuid should be searchable ]) def test_enable_event_tracing_is_true(self, test_env, splunk_logger, query_input): @@ -109,7 +109,7 @@ def test_search_by_wrong_extra_fields(self, test_env, splunk_logger, query_input @pytest.mark.Critical @pytest.mark.parametrize("query_input", [ - "index={} cf_app_name=data_gen subscription-id::* event_type=LogMessage" + "index={} cf_app_name=data_gen firehose-subscription-id::* event_type=LogMessage" ]) def test_fields_and_values_in_splunk_event(self, test_env, splunk_logger, query_input): self.splunk_api = SplunkApi(test_env, splunk_logger) @@ -125,7 +125,7 @@ def test_fields_and_values_in_splunk_event(self, test_env, splunk_logger, query_ 'index': test_env['splunk_index'], 'source': 'compute', 'sourcetype': 'cf:logmessage', - 'subscription-id': 'splunk-ci' + 'firehose-subscription-id': 'splunk-ci' } assert_json_contains(expect_content, last_event, "Event raw data results mismatch") diff --git a/testing/integration/testcases/test_nozzle_configurations_local.py b/testing/integration/testcases/test_nozzle_configurations_local.py index 1cc58a21..9c32ff27 100644 --- a/testing/integration/testcases/test_nozzle_configurations_local.py +++ b/testing/integration/testcases/test_nozzle_configurations_local.py @@ -71,7 +71,7 @@ def test_search_by_extra_fields(self, query_input, is_result_empty, test_env, sp @pytest.mark.Critical @pytest.mark.parametrize("query_input", [ "index={0} test_tag::{1} nozzle-event-counter>0", # nozzle-event-counter should not be searchable - "index={0} test_tag::{1} subscription-id::splunk-ci", # subscription-id should not be searchable + "index={0} test_tag::{1} firehose-subscription-id::splunk-ci", # subscription-id should not be searchable "index={0} test_tag::{1} uuid::*" # uuid should not be searchable ]) def test_enable_event_tracing_is_false(self, test_env, query_input, splunk_logger): diff --git a/tile/tile.yml b/tile/tile.yml index b71144e2..f40ad19a 100644 --- a/tile/tile.yml +++ b/tile/tile.yml @@ -1,7 +1,7 @@ --- name: splunk-nozzle label: Splunk Firehose Nozzle for Vmware Tanzu -description: Forward firehose logs & metrics to Splunk +description: Forward firehose logs and metrics to Splunk icon_file: icon.png apply_open_security_group: true # Apply open security group, default: false @@ -28,26 +28,27 @@ forms: - name: splunk_host type: string label: HTTP Event Collector Endpoint URL - description: HTTP Event Collector endpoint URL. + description: Splunk HTTP Event Collector endpoint URL. It is a required parameter. - name: splunk_token type: secret label: HTTP Event Collector Token - description: Splunk HTTP Event Collector token. + description: Splunk HTTP Event Collector token. It is a required parameter. - name: skip_ssl_validation_splunk type: boolean label: Skip SSL Validation default: false description: Skip SSL certificate validation for connection to Splunk. Secure communications will not check SSL certificates against a trusted Certificate Authority. Skipping SSL validation in production environment is not recommended. - - name: splunk_index + - name: splunk_index #It's a required parameter in config.go and doesn't have default, but here it has default value type: string label: Index - description: The name of the Splunk index that events will be sent to. WARNING:Setting an invalid index will cause events to be lost. + description: The name of the Splunk index that events will be sent to. It is a required parameter. WARNING:Setting an invalid index will cause events to be lost. default: main - name: splunk_logging_index type: string label: Logging Index - description: The name of the Splunk index where logging events will be sent to. WARNING:Setting an invalid index will cause events to be lost. When not provided, all logging events will be forwarded to the splunk_index. + description: The name of the Splunk index where logging events will be sent to. When not provided, all logging events will be forwarded to the splunk_index. WARNING:Setting an invalid index will cause internal events to be lost. default: "" + optional: true - name: cf-config label: Cloud Foundry Settings @@ -56,15 +57,15 @@ forms: - name: api_endpoint type: string label: API Endpoint - description: Cloud Foundry API endpoint. + description: Cloud Foundry API endpoint. It is a required parameter. - name: client_id type: string label: Client ID - description: CF UAA client ID + description: CF UAA Client ID. It is a required parameter. - name: client_secret type: secret label: Client Secret - description: CF UAA client secret + description: CF UAA Client Secret. It is a required parameter. - name: skip_ssl_validation_cf type: boolean label: Skip SSL Validation @@ -75,11 +76,8 @@ forms: label: Event Types default: [ - "HttpStartStop", - "LogMessage", "ValueMetric", "CounterEvent", - "Error", "ContainerMetric", ] options: @@ -104,13 +102,14 @@ forms: - name: scale_out_nozzle type: integer label: Scale Out Nozzle - description: Scale out Splunk nozzle. Recommendation:Run 2 or more nozzles for high availability. + description: Adds more Splunk nozzle instances to spread the load. Recommendation:Run 2 or more nozzles for high availability. default: 2 - name: firehose_subscription_id type: string label: Firehose Subscription ID - description: Unique subscription ID to nozzle. Firehose balances across socket connections with the same ID. + description: Unique subscription ID to tag nozzle events. Firehose distribute data evenly across all instances if you use the same subscription ID on each nozzle instance. optional: true + default: splunk-firehose - name: add_app_info type: multi_select_options label: Add App Information @@ -126,12 +125,12 @@ forms: label: SpaceName - name: SpaceGuid label: SpaceGuid - description: Enriches event raw data with application metadata + description: Enriches raw data in events with application metadata - name: add_tags type: boolean label: Add Tags default: false - description: Add additional tags from envelope to Splunk Event. + description: Add additional tags from envelope to Splunk Event. WARNING:Enabling this feature may slightly impact the performance due to the increased event size. - name: extra_fields type: string label: Additional Fields @@ -140,7 +139,7 @@ forms: - name: hec_retries type: integer label: HEC Retries - default: 3 + default: 5 description: The retry count for sending events to the Splunk platform. Events not successfully sent after this number of retries will be dropped, causing data loss. - name: hec_batch_size type: integer @@ -151,7 +150,7 @@ forms: type: integer label: HEC Workers default: 8 - description: The number of concurrent workers sending data to Splunk HTTP Event Collector. Scale this number to your Splunk platform data collection capacity accordingly. + description: The number of concurrent workers sending data to Splunk HTTP Event Collector. Scaling this number will improve your Splunk platform data collection capacity. - name: consumer_queue_size type: integer label: Consumer Queue Size @@ -159,9 +158,9 @@ forms: description: The internal consumer queue buffer size. Events will be sent to your Splunk platform after queue is full. - name: status_monitor_interval type: string - label: Monitor Queue Pressure + label: Status Monitor Interval default: 0s - description: Time interval (in s/m/h. For example, 3600s or 60m or 1h) for monitoring memory queue pressure. Use to help with back-pressure insights. (Increases CPU load. Use for insights purposes only) Default is 0s (Disabled). + description: Time interval (in s/m/h. For example, 3600s or 60m or 1h) to enable monitoring of metric data within the connector. (This increases CPU load and should be used only for insights purposes. Default:0s) - name: flush_interval type: string label: Flush Interval @@ -171,42 +170,42 @@ forms: type: string label: Missing App Cache Invalidate TTL default: 0s - description: Time interval (in s/m/h. For example, 3600s or 60m or 1h) between refreshing the missing app info cache. Set to 0s to maintain cache until nozzle restart. + description: Time interval (in s/m/h. For example, 3600s or 60m or 1h) between refreshing the cache of missed application information. Set to 0s to maintain cache until nozzle restart. - name: app_cache_invalidate_ttl type: string label: App Cache Invalidate TTL default: 0s - description: Time interval (in s/m/h. For example, 3600s or 60m or 1h) between refreshing the app info local cache. Set to 0s to only populate the cache during startup or restart of the nozzle. + description: Time interval (in s/m/h. For example, 3600s or 60m or 1h) between refreshing the application information local cache. Set to 0s to only populate the cache during startup or restart of the nozzle. - name: org_space_cache_invalidate_ttl type: string label: Org Space Cache Invalidate TTL default: 72h - description: Time interval (in s/m/h. For example, 3600s or 60m or 1h) between refreshing the org and space cache. Defaults to 72h. + description: Time interval (in s/m/h. For example, 3600s or 60m or 1h) between refreshing the organization and space cache. (Default:72h) - name: app_limits type: integer label: App Limits default: 0 - description: The number of apps for which metadata is gathered when refreshing the app metadata cache (order based on app creation date). Set to 0 to remove limit. + description: The number of applications for which metadata is gathered when refreshing the application metadata cache (order is based on application creation date). Set to 0 to remove limit and update all of the applications. - name: nozzle_memory type: string label: Nozzle Memory - description: Nozzle memory in MB. + description: Nozzle memory in MB. (Default:256M) default: 256M - name: firehose_keep_alive type: string label: Firehose Keep Alive - description: Keep alive duration (in sec) for the firehose consumer. + description: Keep alive duration (in seconds) for the firehose consumer. default: 25s - name: enable_event_tracing type: boolean label: Enable Event Tracing default: false - description: Enables data loss tracing. + description: Enables tracing of data loss. Splunk events will now contain a UUID, Splunk Nozzle Event Counts, and a Subscription ID for Splunk correlation searches. - name: ignore_missing_app type: boolean label: Ignore Missing App default: true - description: Do not trigger an app metadata refresh when encountering data from an app without info in the app metadata cache. + description: If the application is missing, then stop repeatedly querying for information from Cloud Foundry. - name: selected_monitoring_metrics type: multi_select_options label: Metric types @@ -256,27 +255,29 @@ forms: label: nozzle.cache.boltdb.hit - name: nozzle.cache.boltdb.miss label: nozzle.cache.boltdb.miss - description: Comma separated list of metrics that user want to visualize + description: Comma separated list of metrics that user want to monitor - name: splunk_metric_index type: string label: Splunk Metric Index - description: Index where Metric Data will be indexed + description: Index where Metric Data will be ingested when monitoring module is enabled optional: true - name: refresh_splunk_connection type: boolean label: Refresh Splunk connection description: Periodically refresh connection to Splunk optional: true + default: false - name: keep_alive_timer type: string label: Keep alive timer - description: Interval used to close and refresh connection to Splunk + description: Time after which connection to Splunk will be refreshed, if Refresh Splunk Connection is set to true (in s/m/h. For example, 3600s or 60m or 1h). optional: true + default: 30s - name: memory_ballast_size type: integer label: Memory Ballast Size default: 0 - description: Size of memory allocated to reduce GC cycles. Default is 0, Size should be less than the total memory. + description: Size of memory allocated to reduce GC cycles. Size should be less than the total memory (Default:0). migration: | if (typeof properties['properties']['.properties.add_app_info']['value'] == "boolean") {