Add some rmr library stats into metrics
[ric-plt/xapp-frame.git] / pkg / xapp / xapp.go
index 96aa057..12f1628 100755 (executable)
@@ -23,6 +23,7 @@ import (
        "bytes"
        "encoding/json"
        "fmt"
+       "net"
        "net/http"
        "os"
        "os/signal"
@@ -36,6 +37,7 @@ import (
 )
 
 // For testing purpose go version 1.13 ->
+
 var _ = func() bool {
        testing.Init()
        return true
@@ -64,6 +66,16 @@ var (
        shutdownCnt   int32
 )
 
+var startTime time.Time
+
+func XappUpTime() time.Duration {
+       return time.Since(startTime)
+}
+
+func init() {
+       startTime = time.Now()
+}
+
 func IsReady() bool {
        return Rmr != nil && Rmr.IsReady() && SdlStorage != nil && SdlStorage.IsReady()
 }
@@ -100,7 +112,7 @@ func registerXapp() {
        for {
                time.Sleep(5 * time.Second)
                if !IsHealthProbeReady() {
-                       Logger.Info("Application='%s' is not ready yet, waiting ...", viper.GetString("name"))
+                       Logger.Debug("Application='%s' is not ready yet, waiting ...", viper.GetString("name"))
                        continue
                }
 
@@ -154,6 +166,7 @@ func doRegister() error {
        xappversion := viper.GetString("version")
        pltNs := getPltNamespace("PLT_NAMESPACE", DEFAULT_PLT_NS)
 
+       //httpEp, rmrEp := getService(xappname, SERVICE_HTTP), getService(xappname, SERVICE_RMR)
        httpEp, rmrEp := getService(host, SERVICE_HTTP), getService(host, SERVICE_RMR)
        if httpEp == "" || rmrEp == "" {
                Logger.Warn("Couldn't resolve service endpoints: httpEp=%s rmrEp=%s", httpEp, rmrEp)
@@ -271,12 +284,41 @@ func init() {
        InstallSignalHandler()
 }
 
+func GetIpAddress() (string, error) {
+       ifname := os.Getenv("INTERFACE_NAME")
+       itf, err := net.InterfaceByName(ifname)
+       if err != nil {
+               return "<nil>", fmt.Errorf("Interface (%s) %w", ifname, err)
+       }
+       item, err := itf.Addrs()
+       if err != nil {
+               return "<nil>", fmt.Errorf("Interface (%s) %w", ifname, err)
+       }
+       for _, addr := range item {
+               switch v := addr.(type) {
+               case *net.IPNet:
+                       if !v.IP.IsLinkLocalUnicast() {
+                               return v.IP.String(), nil
+                       }
+               }
+       }
+       return "<nil>", fmt.Errorf("Interface (%s) couldn't find ip", ifname)
+}
+
 func RunWithParams(c MessageConsumer, sdlcheck bool) {
        Rmr = NewRMRClient()
 
        Rmr.SetReadyCB(XappReadyCb, nil)
-
-       host := fmt.Sprintf(":%d", GetPortData("http").Port)
+       ipString, err := GetIpAddress()
+       if err != nil {
+               Logger.Info("IP address is not able to resolve " + err.Error())
+       }
+       var host string
+       if ipString == "<nil>" {
+               host = fmt.Sprintf(":%d", GetPortData("http").Port)
+       } else {
+               host = fmt.Sprintf("[%s]:%d", ipString, GetPortData("http").Port)
+       }
        go http.ListenAndServe(host, Resource.router)
        Logger.Info(fmt.Sprintf("Xapp started, listening on: %s", host))