Skip to main content

Go Net/HTTP

Prerequisites

New Relic Go agent requires Golang 1.17+

Installation

Following are the steps to install the New Relic agent and connect it with CubeAPM. If New Relic agent is already installed, you can jump to step 4.

  1. Install dependencies

    go get github.com/newrelic/go-agent/v3/newrelic
  2. Add the highlighted lines below to your project's main.go file:

    package main

    import "github.com/newrelic/go-agent/v3/newrelic"

    var app *newrelic.Application

    func main() {
    // initialize newrelic
    app, err := newrelic.NewApplication(
    newrelic.ConfigFromEnvironment(),
    )

    // Start HTTP server.
    srv := &http.Server{
    Addr: ":8000",
    Handler: newHTTPHandler(app),
    }
    }

    func newHTTPHandler(app *newrelic.Application) http.Handler {
    mux := http.NewServeMux()

    handleFunc := func(pattern string, handlerFunc func(http.ResponseWriter, *http.Request)) {
    // Wrap the handler so New Relic can record metrics & traces
    route, wrapped := newrelic.WrapHandleFunc(app, pattern, handlerFunc)
    mux.HandleFunc(route, wrapped)
    }

    // Register handlers.
    handleFunc("/", indexFunc)
    return mux
    }
    info

    For more information, refer to the NewRelic Go documentation.

  3. Configure the agent.

    # Use `newrelic.ConfigFromEnvironment()` as shown in step 2 to load these environment variables.
    NEW_RELIC_APP_NAME=<app_name>
    NEW_RELIC_LICENSE_KEY=ABC4567890ABC4567890ABC4567890ABC4567890
  4. Set up a proxy for New Relic agent.

    New Relic agent has a limitation: it only send data over HTTPS on port 443. However, CubeAPM receives data on port 3130 over HTTP. To bridge this gap, you need to set up a proxy (load balancer or HTTP reverse proxy) that:

    • Accepts HTTPS traffic on port 443 from the New Relic agent
    • Forwards this traffic to your CubeAPM server on port 3130 over HTTP

    For example, you can set up an AWS Application Load Balancer (ALB) with the following configuration:

    • Listener Configuration:

      • Protocol: HTTPS
      • Port: 443
      • Domain name: cubeapm-newrelic.yourdomain.com (example domain for your load balancer)
      • SSL/TLS Certificate: Certificate for cubeapm-newrelic.yourdomain.com or \*.yourdomain.com (from ACM or imported)
    • Target Group Configuration:

      • Protocol: HTTP
      • Port: 3130
      • Target: Your CubeAPM server IP or DNS name (e.g., cubeapm-server.yourdomain.com)
      • Health check path: /health
    • Security Groups:

      • Load Balancer Security Group:

        • Inbound rule: Allow HTTPS (port 443) from your application servers' IPs or security groups
        • Outbound rule: Allow HTTP (port 3130) to the CubeAPM server's IP or security group
      • CubeAPM Server Security Group:

        • Inbound rule: Allow HTTP (port 3130) from the load balancer's security group
        • Outbound rule: Allow all traffic (or as per your security requirements)

    The New Relic agent will connect to the load balancer's domain name (cubeapm-newrelic.yourdomain.com in this example), which will then forward the traffic to your CubeAPM server on port 3130.

    info

    For more details on proxy setup options, refer to the New Relic integration documentation.

  5. Tell the agent to connect with CubeAPM instead of New Relic:

    NEW_RELIC_APP_NAME=<app_name>
    NEW_RELIC_LICENSE_KEY=ABC4567890ABC4567890ABC4567890ABC4567890
    # Use your load balancer's domain name here
    NEW_RELIC_HOST=<cubeapm-newrelic.yourdomain.com>

Sample App

A working example with multiple instrumentations is available at https://github.com/cubeapm/sample_app_go_net_http/tree/newrelic

Troubleshooting

The following can be used for debugging:

# Print New Relic agent logs on screen
NEW_RELIC_LOG=stdout
# Set New Relic agent log level to debug if needed to see detailed logs
NEW_RELIC_LOG_LEVEL=debug