How to configure retries with HTTP Event Collector stream for Bunyan

This topic demonstrates how to configure retries upon connection errors with the Splunk Bunyan logger. The retry.js example included in the examples directory of the HTTP Event Collector stream for Bunyan package provides a sample implementation. It has also been pasted below.

Note: The examples are not installed when using the npm installation method. To obtain copies of the examples, download the Splunk HTTP Event Collector stream for Bunyan package.

Example walkthrough

This example includes the logic to configure connection retries if there are connection errors that occur upon sending a request to HTTP Event Collector on Splunk Enterprise or Splunk Cloud. To see the retry logic working, you should disable your network connection, run the sample, and then re-enable the connection. Once the connection is enabled, the events will be sent to Splunk Enterprise or Splunk Cloud.

First, we add require statements for Bunyan and the EC stream for Bunyan.

Then, we declare a config variable to store the configuration information for the Splunk Enterprise instance or Splunk Cloud server. Only the token property is required, but in this example, we've set the token and url properties. We've also added the maxRetries property, which determines the maximum number of times the request will be retried if it encounters a connection error. In this case, we've set it equal to 10.

Next, we create a Bunyan stream (splunkStream), plus an error handler.

Then, we create a logger (Logger) using the bunyan.createLogger() function, including a streams array as one of its inputs. Inside the streams array, we include splunkStream.

Next, we define the event payload in the payload variable. We've added fields for the event data itself (temperature and chickenCount in this case). Then we added several special keys to specify metadata that is to be assigned to the event data when HTTP Event Collector receives it. If any of these values (source, sourcetype, and so on) differ from the default values on the server, the values specified here will override the default values. Of course, your JavaScript app will determine what goes into the actual payload contents.

Finally, use the Logger's info() function to send the payload along with a status message.

retry.js

/*
 * Copyright 2015 Splunk, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"): you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

/**
 * This example shows how to configure retries on errors
 * with the Splunk Bunyan logger.
 */

// Change to require("splunk-bunyan-logger");
var splunkBunyan = require("../index");
var bunyan = require("bunyan");

/**
 * Only the token property is required.
 *
 * Here we've set maxRetries to 10,
 * If there are any connection errors the request
 * to Splunk will be retried up to 10 times.
 * The default is 0.
 */
var config = {
    token: "your-token-here",
    url: "https://localhost:8088",
    maxRetries: 10
};
var splunkStream = splunkBunyan.createStream(config);

splunkStream.on("error", function(err, context) {
    // Handle errors here
    console.log("Error", err, "Context", context);
});

// Setup Bunyan, adding splunkStream to the array of streams
var Logger = bunyan.createLogger({
    name: "my logger",
    streams: [
        splunkStream
    ]
});

// Define the payload to send to HTTP Event Collector
var payload = {
    // Our important fields
    temperature: "70F",
    chickenCount: 500,

    // Special keys to specify metadata for HTTP Event Collector
    source: "chicken coop",
    sourcetype: "httpevent",
    index: "main",
    host: "farm.local"
};

// Send the payload
console.log("Sending payload", payload);
Logger.info(payload, "Chicken coup looks stable.");