// +build profile

/*
* Copyright 2022-present Open Networking Foundation
* 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.
*
*
 */

package pprofcontroller

import (
	"net/http"

	// using for init
	_ "net/http/pprof"
    "github.com/opencord/voltha-lib-go/v7/pkg/log"
    "context"
)

var logger log.CLogger
var ctx = context.TODO()

func Init() {
    // Setup this package so that it's log level can be modified at run time
    var err error
    logger, err = log.RegisterPackage(log.JSON, log.ErrorLevel, log.Fields{})
    if err != nil {
        panic(err)
    }
	logger.Error(ctx, "Profiling is ENABLED")
	go func() {
		err := http.ListenAndServe("0.0.0.0:6060", nil)
		logger.Error(ctx, "Profiling enable FAILURE", log.Opts{"Error": err})
	}()
}
