Skip to content

Commit

Permalink
Added support for ppprof builds (#62)
Browse files Browse the repository at this point in the history
CASMHMS-6324
  • Loading branch information
jwlv authored Jan 9, 2025
1 parent 97f2b86 commit 9f75753
Show file tree
Hide file tree
Showing 7 changed files with 204 additions and 5 deletions.
13 changes: 13 additions & 0 deletions .github/workflows/build_and_release_pprof_image.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
name: Build and Publish PProf Enabled Docker Images
on:
- push # Perform a build of the contents from the branch
- pull_request # Perform a build after merging with the target branch
- workflow_dispatch
jobs:
build_and_release:
uses: Cray-HPE/hms-build-image-workflows/.github/workflows/build_and_release_image.yaml@v2
with:
image-name: cray-hmnfd-pprof
docker-build-file: Dockerfile.pprof
enable-pr-comment: true
secrets: inherit
2 changes: 1 addition & 1 deletion .version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.22.0
1.23.0
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

These are changes to charts in support of:

## [1.23.0] - 2025-01-08

### Added

- Added support for ppprof builds

## [1.22.0] - 2023-12-03

### Changed
Expand Down
87 changes: 87 additions & 0 deletions Dockerfile.pprof
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# MIT License
#
# (C) Copyright [2019-2022,2024-2025] Hewlett Packard Enterprise Development LP
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.

# Dockerfile for building Cray-HPE NFD (Node Fanout Daemon) with pprof support.
# The only difference from primary dockerfile is building with the pprof tag

### build-base stage ###
# Build base just has the packages installed we need.
FROM artifactory.algol60.net/docker.io/library/golang:1.23-alpine AS build-base

RUN set -ex \
&& apk -U upgrade \
&& apk add build-base


### base stage ###
# Base copies in the files we need to test/build.
FROM build-base AS base

RUN go env -w GO111MODULE=auto

# Copy all the necessary files to the image.
COPY cmd $GOPATH/src/github.com/Cray-HPE/hms-hmnfd/cmd
COPY vendor $GOPATH/src/github.com/Cray-HPE/hms-hmnfd/vendor


### Build Stage ###
FROM base AS builder

RUN set -ex && go build -v -tags "musl pprof" -o /usr/local/bin/hmnfd github.com/Cray-HPE/hms-hmnfd/cmd/hmi-nfd

### Final Stage ###
FROM artifactory.algol60.net/docker.io/alpine:3.15
LABEL maintainer="Hewlett Packard Enterprise"
EXPOSE 28600
STOPSIGNAL SIGTERM

RUN set -ex \
&& apk -U upgrade \
&& apk add --no-cache curl

# Copy the final binary.

COPY --from=builder /usr/local/bin/hmnfd /usr/local/bin

# Run the daemon. Note that these env vars are likely to be overridden
# by the Helm chart.

ENV DEBUG=0
ENV SM_URL="https://cray-smd/hsm/v2"
ENV INBOUND_SCN_URL="https://cray-hmnfd/hmi/v1/scn"
ENV SM_RETRIES=3
ENV SM_TIMEOUT=10
ENV PORT=28600
ENV USE_TELEMETRY="--use_telemetry"
ENV TELEMETRY_HOST="cluster-kafka-bootstrap.sma.svc.cluster.local:9092:cray-hmsstatechange-notifications"
ENV NOSM=""

# If KV_URL is set to empty the Go code will determine the URL from env vars.
# This is due to the fact that in Dockerfiles you CANNOT create an env var
# using other env vars.

ENV KV_URL=

# nobody 65534:65534
USER 65534:65534

CMD ["sh", "-c", "hmnfd --debug=$DEBUG $NOSM --sm_url=$SM_URL --sm_retries=$SM_RETRIES --sm_timeout=$SM_TIMEOUT --port=$PORT --kv_url=$KV_URL --scn_in_url=$INBOUND_SCN_URL $USE_TELEMETRY --telemetry_host=$TELEMETRY_HOST"]
14 changes: 10 additions & 4 deletions cmd/hmi-nfd/api.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// MIT License
//
// (C) Copyright [2019-2021,2023] Hewlett Packard Enterprise Development LP
// (C) Copyright [2019-2021,2023,2025] Hewlett Packard Enterprise Development LP
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
Expand All @@ -25,9 +25,6 @@ package main
import (
"encoding/json"
"fmt"
base "github.com/Cray-HPE/hms-base/v2"
"github.com/Cray-HPE/hms-xname/xnametypes"
"github.com/gorilla/mux"
"io/ioutil"
"log"
"math"
Expand All @@ -37,6 +34,10 @@ import (
"strings"
"sync"
"time"

base "github.com/Cray-HPE/hms-base/v2"
"github.com/Cray-HPE/hms-xname/xnametypes"
"github.com/gorilla/mux"
)

// A note about subscription tracking and SCN forwarding:
Expand Down Expand Up @@ -1672,6 +1673,11 @@ func newRouter(routes []Route) *mux.Router {
Name(route.Name).
Handler(handler)
}

// If the 'pprof' build tag is set, then this will register pprof handlers,
// otherwise this function is stubbed and will do nothing.
RegisterPProfHandlers(router)

return router
}

Expand Down
54 changes: 54 additions & 0 deletions cmd/hmi-nfd/pprof.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// This file contains the code to enable pprof profiling. It is only
// included in the build when the 'pprof' build tag is set in the Dockerfile.
//
//go:build pprof

/*
* (C) Copyright [2025] Hewlett Packard Enterprise Development LP
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/

package main

import (
"net/http/pprof"
_ "net/http/pprof"

"github.com/gorilla/mux"
)

func RegisterPProfHandlers(router *mux.Router) {
// Main profiling entry point
router.HandleFunc("/hmi/v2/debug/pprof/", pprof.Index) // Index listing all pprof endpoints

// Specific profiling handlers
router.HandleFunc("/hmi/v2/debug/pprof/cmdline", pprof.Cmdline) // Command-line arguments
router.HandleFunc("/hmi/v2/debug/pprof/profile", pprof.Profile) // CPU profile (default: 30 seconds)
router.HandleFunc("/hmi/v2/debug/pprof/symbol", pprof.Symbol) // Symbol resolution for addresses
router.HandleFunc("/hmi/v2/debug/pprof/trace", pprof.Trace) // Execution trace (default: 1 second)

// Additional profiling endpoints
router.Handle("/hmi/v2/debug/pprof/allocs", pprof.Handler("allocs")) // Heap allocation samples
router.Handle("/hmi/v2/debug/pprof/block", pprof.Handler("block")) // Goroutine blocking events
router.Handle("/hmi/v2/debug/pprof/goroutine", pprof.Handler("goroutine")) // Stack traces of all goroutines
router.Handle("/hmi/v2/debug/pprof/heap", pprof.Handler("heap")) // Memory heap profile
router.Handle("/hmi/v2/debug/pprof/mutex", pprof.Handler("mutex")) // Mutex contention profile
router.Handle("/hmi/v2/debug/pprof/threadcreate", pprof.Handler("threadcreate")) // Stack traces of thread creation
}
33 changes: 33 additions & 0 deletions cmd/hmi-nfd/pprof_stub.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// This file contains a stub implementation of the RegisterPProfHandlers()
// function which is a noop.  It is included in the build by default by
// way of the 'pprof' build tag not being set in the Dockerfile.
//
//go:build !pprof

/*
* (C) Copyright [2025] Hewlett Packard Enterprise Development LP
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/

package main

import "github.com/gorilla/mux"

func RegisterPProfHandlers(router *mux.Router) { }

0 comments on commit 9f75753

Please sign in to comment.