Skip to content

Commit

Permalink
CASMHMS-6324: Added support for ppprof builds
Browse files Browse the repository at this point in the history
  • Loading branch information
jwlv committed Dec 23, 2024
1 parent 97f2b86 commit ea7f7d2
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 7 deletions.
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
11 changes: 9 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# MIT License
#
# (C) Copyright [2019-2022,2024] Hewlett Packard Enterprise Development LP
# (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"),
Expand Down Expand Up @@ -45,8 +45,15 @@ 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 -o /usr/local/bin/hmnfd github.com/Cray-HPE/hms-hmnfd/cmd/hmi-nfd
# Set profiling to disabled by default
ARG ENABLE_PPROF=true

# Conditionally build with the pprof tag if profiling is enabled
RUN if [ "$ENABLE_PPROF" = "true" ]; then \
set -ex && go build -v -tags "musl pprof" -o /usr/local/bin/hmnfd github.com/Cray-HPE/hms-hmnfd/cmd/hmi-nfd; \
else \
set -ex && go build -v -tags musl -o /usr/local/bin/hmnfd github.com/Cray-HPE/hms-hmnfd/cmd/hmi-nfd; \
fi

### Final Stage ###
FROM artifactory.algol60.net/docker.io/alpine:3.15
Expand Down
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("/v1/debug/pprof/", pprof.Index) // Index listing all pprof endpoints

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

// Additional profiling endpoints
router.Handle("/v1/debug/pprof/allocs", pprof.Handler("allocs")) // Heap allocation samples
router.Handle("/v1/debug/pprof/block", pprof.Handler("block")) // Goroutine blocking events
router.Handle("/v1/debug/pprof/goroutine", pprof.Handler("goroutine")) // Stack traces of all goroutines
router.Handle("/v1/debug/pprof/heap", pprof.Handler("heap")) // Memory heap profile
router.Handle("/v1/debug/pprof/mutex", pprof.Handler("mutex")) // Mutex contention profile
router.Handle("/v1/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 ea7f7d2

Please sign in to comment.