* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
+ *
+ * This source code is part of the near-RT RIC (RAN Intelligent Controller)
+ * platform project (RICP).
+ *
*/
package main
import (
"encoding/json"
- "gopkg.in/yaml.v2"
"io"
+ "io/ioutil"
"os"
"strconv"
+ "strings"
"time"
+
+ "gopkg.in/yaml.v2"
)
+const defaultReportingEntityID = "00000000-0000-0000-0000-000000000000"
+const defaultVNFName = "Vespa"
+const defaultNFNamingCode = "ricp"
+
+func readSystemUUID() string {
+ data, err := ioutil.ReadFile("/sys/class/dmi/id/product_uuid")
+ if err != nil {
+ return defaultReportingEntityID
+ }
+ return strings.TrimSpace(string(data))
+}
+
+func getVNFName() string {
+ VNFName := os.Getenv("VESMGR_VNFNAME")
+ if VNFName == "" {
+ return defaultVNFName
+ }
+ return VNFName
+}
+
+func getNFNamingCode() string {
+ NFNamingCode := os.Getenv("VESMGR_NFNAMINGCODE")
+ if NFNamingCode == "" {
+ return defaultNFNamingCode
+ }
+ return NFNamingCode
+}
+
func basicVespaConf() VESAgentConfiguration {
var vespaconf = VESAgentConfiguration{
DataDir: "/tmp/data",
Debug: false,
Event: EventConfiguration{
- VNFName: "vespa-demo", // XXX
- ReportingEntityID: "1af5bfa9-40b4-4522-b045-40e54f0310f", // XXX
- MaxSize: 2000000,
- NfNamingCode: "hsxp",
- NfcNamingCodes: []NfcNamingCode{
- NfcNamingCode{
- Type: "oam",
- Vnfcs: []string{"lr-ope-0", "lr-ope-1", "lr-ope-2"},
- },
- NfcNamingCode{
- Type: "etl",
- Vnfcs: []string{"lr-pro-0", "lr-pro-1"},
- },
- },
+ VNFName: getVNFName(),
+ ReportingEntityName: "Vespa",
+ ReportingEntityID: readSystemUUID(),
+ MaxSize: 2000000,
+ NfNamingCode: getNFNamingCode(),
+ NfcNamingCodes: []NfcNamingCode{},
RetryInterval: time.Second * 5,
MaxMissed: 2,
},
Measurement: MeasurementConfiguration{
+ // Domain abbreviation has to be set to “Mvfs” for VES 5.3,
+ // and to “Measurement” for later VES interface versions.
DomainAbbreviation: "Mvfs",
MaxBufferingDuration: time.Hour,
Prometheus: PrometheusConfig{
return vespaconf
}
+// AppMetricsStruct contains xapplication metrics definition
type AppMetricsStruct struct {
ObjectName string
ObjectInstance string
- // xxx add labels here
}
+// AppMetrics contains metrics definitions for all Xapps
type AppMetrics map[string]AppMetricsStruct
// Parses the metrics data from an array of bytes, which is expected to contain a JSON
json.Unmarshal(descriptor, &desc)
for _, app := range desc {
- config, config_ok := app["config"]
- if config_ok {
- metrics, metrics_ok := config.(map[string]interface{})["metrics"]
- if metrics_ok {
+ config, configOk := app["config"]
+ if configOk {
+ metrics, metricsOk := config.(map[string]interface{})["metrics"]
+ if metricsOk {
parseMetricsRules(metrics.([]interface{}), appMetrics)
}
}
// Entries, which do not have all the necessary fields, are ignored.
func parseMetricsRules(metricsMap []interface{}, appMetrics AppMetrics) AppMetrics {
for _, element := range metricsMap {
- name, name_ok := element.(map[string]interface{})["name"].(string)
- if name_ok {
- _, already_found := appMetrics[name]
- objectName, objectName_ok := element.(map[string]interface{})["objectName"].(string)
- objectInstance, objectInstance_ok := element.(map[string]interface{})["objectInstance"].(string)
- if !already_found && objectName_ok && objectInstance_ok {
+ name, nameOk := element.(map[string]interface{})["name"].(string)
+ if nameOk {
+ _, alreadyFound := appMetrics[name]
+ objectName, objectNameOk := element.(map[string]interface{})["objectName"].(string)
+ objectInstance, objectInstanceOk := element.(map[string]interface{})["objectInstance"].(string)
+ if !alreadyFound && objectNameOk && objectInstanceOk {
appMetrics[name] = AppMetricsStruct{objectName, objectInstance}
logger.Info("parsed counter %s %s %s", name, objectName, objectInstance)
}
- if already_found {
+ if alreadyFound {
logger.Info("skipped duplicate counter %s", name)
}
}
appMetrics := make(AppMetrics)
parseMetricsFromXAppDescriptor(xAppConfig, appMetrics)
- makeRule := func(expr string, obj_name string, obj_instance string) MetricRule {
+ makeRule := func(expr string, objName string, objInstance string) MetricRule {
return MetricRule{
Target: "AdditionalObjects",
Expr: expr,
- ObjectInstance: obj_instance,
- ObjectName: obj_name,
+ ObjectInstance: objInstance,
+ ObjectName: objName,
ObjectKeys: []Label{
Label{
Name: "ricComponentName",
vespaconf.PrimaryCollector.FQDN = os.Getenv("VESMGR_PRICOLLECTOR_ADDR")
vespaconf.PrimaryCollector.ServerRoot = os.Getenv("VESMGR_PRICOLLECTOR_SERVERROOT")
vespaconf.PrimaryCollector.Topic = os.Getenv("VESMGR_PRICOLLECTOR_TOPIC")
- port_str := os.Getenv("VESMGR_PRICOLLECTOR_PORT")
- if port_str == "" {
+ portStr := os.Getenv("VESMGR_PRICOLLECTOR_PORT")
+ if portStr == "" {
vespaconf.PrimaryCollector.Port = 8443
} else {
- port, _ := strconv.Atoi(port_str)
+ port, _ := strconv.Atoi(portStr)
vespaconf.PrimaryCollector.Port = port
}
- secure_str := os.Getenv("VESMGR_PRICOLLECTOR_SECURE")
- if secure_str == "true" {
+ secureStr := os.Getenv("VESMGR_PRICOLLECTOR_SECURE")
+ if secureStr == "true" {
vespaconf.PrimaryCollector.Secure = true
} else {
vespaconf.PrimaryCollector.Secure = false