diff --git a/apier/v1/apier_local_test.go b/apier/v1/apier_local_test.go index eaaa8c6bc..90175a08e 100644 --- a/apier/v1/apier_local_test.go +++ b/apier/v1/apier_local_test.go @@ -79,7 +79,7 @@ func TestApierCreateDirs(t *testing.T) { if !*testLocal { return } - for _, pathDir := range []string{cfg.CdreProfiles[utils.META_DEFAULT].ExportFolder, "/var/log/cgrates/cdrc/in", "/var/log/cgrates/cdrc/out", cfg.HistoryDir} { + for _, pathDir := range []string{cfg.CdreProfiles[utils.META_DEFAULT].ExportDirectory, "/var/log/cgrates/cdrc/in", "/var/log/cgrates/cdrc/out", cfg.HistoryDir} { if err := os.RemoveAll(pathDir); err != nil { t.Fatal("Error removing folder: ", pathDir, err) diff --git a/apier/v1/cdre.go b/apier/v1/cdre.go index 224058cfc..fd4957e6e 100644 --- a/apier/v1/cdre.go +++ b/apier/v1/cdre.go @@ -120,7 +120,7 @@ func (self *ApierV1) ExportCdrsToFile(attr utils.AttrExpFileCdrs, reply *utils.E return fmt.Errorf("%s:FieldSeparator:%s", utils.ErrServerError.Error(), "Invalid") } } - exportDir := exportTemplate.ExportFolder + exportDir := exportTemplate.ExportDirectory if attr.ExportDir != nil && len(*attr.ExportDir) != 0 { exportDir = *attr.ExportDir } diff --git a/apier/v2/cdre.go b/apier/v2/cdre.go index 31ea8f43e..e0fe280e1 100644 --- a/apier/v2/cdre.go +++ b/apier/v2/cdre.go @@ -56,9 +56,9 @@ func (self *ApierV2) ExportCdrsToFile(attr utils.AttrExportCdrsToFile, reply *ut return fmt.Errorf("%s:FieldSeparator:%s", utils.ErrServerError, "Invalid") } } - ExportFolder := exportTemplate.ExportFolder - if attr.ExportFolder != nil && len(*attr.ExportFolder) != 0 { - ExportFolder = *attr.ExportFolder + eDir := exportTemplate.ExportDirectory + if attr.ExportDirectory != nil && len(*attr.ExportDirectory) != 0 { + eDir = *attr.ExportDirectory } ExportID := strconv.FormatInt(time.Now().Unix(), 10) if attr.ExportID != nil && len(*attr.ExportID) != 0 { @@ -68,7 +68,7 @@ func (self *ApierV2) ExportCdrsToFile(attr utils.AttrExportCdrsToFile, reply *ut if attr.ExportFileName != nil && len(*attr.ExportFileName) != 0 { fileName = *attr.ExportFileName } - filePath := path.Join(ExportFolder, fileName) + filePath := path.Join(eDir, fileName) if cdrFormat == utils.DRYRUN { filePath = utils.DRYRUN } diff --git a/cdre/cdrexporter.go b/cdre/cdrexporter.go index d7d9f2127..263808c08 100644 --- a/cdre/cdrexporter.go +++ b/cdre/cdrexporter.go @@ -208,6 +208,7 @@ func (cdre *CdrExporter) processCdr(cdr *engine.CDR) error { } else if cdr.ExtraFields == nil { // Avoid assignment in nil map if not initialized cdr.ExtraFields = make(map[string]string) } + utils.Logger.Debug(fmt.Sprintf("CdrExporter, processCdr: %+v", cdr)) // Cost multiply if cdre.dataUsageMultiplyFactor != 0.0 && cdr.ToR == utils.DATA { cdr.UsageMultiply(cdre.dataUsageMultiplyFactor, cdre.cgrPrecision) @@ -226,6 +227,7 @@ func (cdre *CdrExporter) processCdr(cdr *engine.CDR) error { utils.Logger.Err(fmt.Sprintf(" Cannot export CDR with CGRID: %s and runid: %s, error: %s", cdr.CGRID, cdr.RunID, err.Error())) return err } + utils.Logger.Debug(fmt.Sprintf("CdrExporter, cdrRow: %+v", cdrRow)) if len(cdrRow) == 0 { // No CDR data, most likely no configuration fields defined return nil } else { @@ -324,7 +326,9 @@ func (cdre *CdrExporter) writeCsv(csvWriter *csv.Writer) error { return err } } + utils.Logger.Debug(fmt.Sprintf("CdrExporter, writeCsv cdrContents: %+v", cdre.content)) for _, cdrContent := range cdre.content { + utils.Logger.Debug(fmt.Sprintf("CdrExporter, cdrContent: %+v", cdrContent)) if err := csvWriter.Write(cdrContent); err != nil { return err } diff --git a/config/cdreconfig.go b/config/cdreconfig.go index f55bad28e..50285b700 100644 --- a/config/cdreconfig.go +++ b/config/cdreconfig.go @@ -31,7 +31,7 @@ type CdreConfig struct { CostShiftDigits int MaskDestinationID string MaskLength int - ExportFolder string + ExportDirectory string HeaderFields []*CfgCdrField ContentFields []*CfgCdrField TrailerFields []*CfgCdrField @@ -76,8 +76,8 @@ func (self *CdreConfig) loadFromJsonCfg(jsnCfg *CdreJsonCfg) error { if jsnCfg.Mask_length != nil { self.MaskLength = *jsnCfg.Mask_length } - if jsnCfg.Export_folder != nil { - self.ExportFolder = *jsnCfg.Export_folder + if jsnCfg.Export_directory != nil { + self.ExportDirectory = *jsnCfg.Export_directory } if jsnCfg.Header_fields != nil { if self.HeaderFields, err = CfgCdrFieldsFromCdrFieldsJsonCfg(*jsnCfg.Header_fields); err != nil { @@ -111,7 +111,7 @@ func (self *CdreConfig) Clone() *CdreConfig { clnCdre.CostShiftDigits = self.CostShiftDigits clnCdre.MaskDestinationID = self.MaskDestinationID clnCdre.MaskLength = self.MaskLength - clnCdre.ExportFolder = self.ExportFolder + clnCdre.ExportDirectory = self.ExportDirectory clnCdre.HeaderFields = make([]*CfgCdrField, len(self.HeaderFields)) for idx, fld := range self.HeaderFields { clonedVal := *fld diff --git a/config/cdreconfig_test.go b/config/cdreconfig_test.go index ec236ff6d..474474f3b 100644 --- a/config/cdreconfig_test.go +++ b/config/cdreconfig_test.go @@ -30,11 +30,11 @@ func TestCdreCfgClone(t *testing.T) { emptyFields := []*CfgCdrField{} initContentFlds := []*CfgCdrField{ &CfgCdrField{Tag: "CgrId", - Type: "cdrfield", + Type: "*composed", FieldId: "cgrid", Value: cgrIdRsrs}, &CfgCdrField{Tag: "RunId", - Type: "cdrfield", + Type: "*composed", FieldId: "mediation_runid", Value: runIdRsrs}, } @@ -47,16 +47,16 @@ func TestCdreCfgClone(t *testing.T) { CostShiftDigits: 0, MaskDestinationID: "MASKED_DESTINATIONS", MaskLength: 0, - ExportFolder: "/var/spool/cgrates/cdre", + ExportDirectory: "/var/spool/cgrates/cdre", ContentFields: initContentFlds, } eClnContentFlds := []*CfgCdrField{ &CfgCdrField{Tag: "CgrId", - Type: "cdrfield", + Type: "*composed", FieldId: "cgrid", Value: cgrIdRsrs}, &CfgCdrField{Tag: "RunId", - Type: "cdrfield", + Type: "*composed", FieldId: "mediation_runid", Value: runIdRsrs}, } @@ -69,7 +69,7 @@ func TestCdreCfgClone(t *testing.T) { CostShiftDigits: 0, MaskDestinationID: "MASKED_DESTINATIONS", MaskLength: 0, - ExportFolder: "/var/spool/cgrates/cdre", + ExportDirectory: "/var/spool/cgrates/cdre", HeaderFields: emptyFields, ContentFields: eClnContentFlds, TrailerFields: emptyFields, diff --git a/config/config_defaults.go b/config/config_defaults.go index b9d7ea48d..50ee0db7f 100644 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -207,7 +207,7 @@ const CGRATES_CFG_JSON = ` "cost_shift_digits": 0, // shift digits in the cost on export (eg: convert from EUR to cents) "mask_destination_id": "MASKED_DESTINATIONS", // destination id containing called addresses to be masked on export "mask_length": 0, // length of the destination suffix to be masked - "export_folder": "/var/spool/cgrates/cdre", // path where the exported CDRs will be placed + "export_directory": "/var/spool/cgrates/cdre", // path where the exported CDRs will be placed "header_fields": [], // template of the exported header fields "content_fields": [ // template of the exported content fields {"tag": "CGRID", "type": "*composed", "value": "CGRID"}, diff --git a/config/config_json_test.go b/config/config_json_test.go index 6a478b12f..380850013 100644 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -249,7 +249,7 @@ func TestDfCdreJsonCfgs(t *testing.T) { Cost_shift_digits: utils.IntPointer(0), Mask_destination_id: utils.StringPointer("MASKED_DESTINATIONS"), Mask_length: utils.IntPointer(0), - Export_folder: utils.StringPointer("/var/spool/cgrates/cdre"), + Export_directory: utils.StringPointer("/var/spool/cgrates/cdre"), Header_fields: &eFields, Content_fields: &eContentFlds, Trailer_fields: &eFields, diff --git a/config/libconfig_json.go b/config/libconfig_json.go index bd6495a48..71da60a47 100644 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -140,7 +140,7 @@ type CdreJsonCfg struct { Cost_shift_digits *int Mask_destination_id *string Mask_length *int - Export_folder *string + Export_directory *string Header_fields *[]*CdrFieldJsonCfg Content_fields *[]*CdrFieldJsonCfg Trailer_fields *[]*CdrFieldJsonCfg diff --git a/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json b/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json index 1425caab7..06254d64a 100644 --- a/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json @@ -60,21 +60,21 @@ "export_dir": "/tmp/cgr_fsevsock/cgrates/cdre", // path where the exported CDRs will be placed "header_fields": [], // template of the exported header fields "content_fields": [ // template of the exported content fields - {"tag": "CgrId", "cdr_field_id": "cgrid", "type": "cdrfield", "value": "cgrid"}, - {"tag":"RunId", "cdr_field_id": "mediation_runid", "type": "cdrfield", "value": "mediation_runid"}, - {"tag":"Tor", "cdr_field_id": "tor", "type": "cdrfield", "value": "tor"}, - {"tag":"AccId", "cdr_field_id": "accid", "type": "cdrfield", "value": "accid"}, - {"tag":"ReqType", "cdr_field_id": "reqtype", "type": "cdrfield", "value": "reqtype"}, - {"tag":"Direction", "cdr_field_id": "direction", "type": "cdrfield", "value": "direction"}, - {"tag":"Tenant", "cdr_field_id": "tenant", "type": "cdrfield", "value": "tenant"}, - {"tag":"Category", "cdr_field_id": "category", "type": "cdrfield", "value": "category"}, - {"tag":"Account", "cdr_field_id": "account", "type": "cdrfield", "value": "account"}, - {"tag":"Subject", "cdr_field_id": "subject", "type": "cdrfield", "value": "subject"}, - {"tag":"Destination", "cdr_field_id": "destination", "type": "cdrfield", "value": "destination"}, - {"tag":"SetupTime", "cdr_field_id": "setup_time", "type": "cdrfield", "value": "setup_time", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"AnswerTime", "cdr_field_id": "answer_time", "type": "cdrfield", "value": "answer_time", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"Usage", "cdr_field_id": "usage", "type": "cdrfield", "value": "usage"}, - {"tag":"Cost", "cdr_field_id": "cost", "type": "cdrfield", "value": "cost"}, + {"tag": "CgrId", "type": "*composed", "value": "CGRID"}, + {"tag":"RunId", "type": "*composed", "value": "RunID"}, + {"tag":"Tor", "type": "cdrfield", "value": "ToR"}, + {"tag":"AccId", "type": "*composed", "value": "OriginID"}, + {"tag":"ReqType", "type": "*composed", "value": "RequestType"}, + {"tag":"Direction", "type": "*composed", "value": "Direction"}, + {"tag":"Tenant", "type": "*composed", "value": "Tenant"}, + {"tag":"Category", "type": "*composed", "value": "Category"}, + {"tag":"Account", "type": "*composed", "value": "Account"}, + {"tag":"Subject", "type": "*composed", "value": "Subject"}, + {"tag":"Destination", "type": "*composed", "value": "Destination"}, + {"tag":"SetupTime", "type": "*datetime", "value": "SetupTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag":"AnswerTime", "type": "*datetime", "value": "AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag":"Usage", "type": "*datetime", "value": "Usage"}, + {"tag":"Cost", "type": "*composed", "value": "Cost"}, ], "trailer_fields": [], // template of the exported trailer fields }, @@ -92,16 +92,16 @@ "export_dir": "/tmp/cgr_fsevsock/cgrates/cdre", // path where the exported CDRs will be placed "header_fields": [], // template of the exported header fields "content_fields": [ // template of the exported content fields - {"tag": "CgrId", "cdr_field_id": "cgrid", "type": "cdrfield", "value": "cgrid"}, - {"tag":"AccId", "cdr_field_id": "accid", "type": "cdrfield", "value": "accid"}, - {"tag":"ReqType", "cdr_field_id": "reqtype", "type": "cdrfield", "value": "reqtype"}, - {"tag":"Tenant", "cdr_field_id": "tenant", "type": "cdrfield", "value": "tenant"}, - {"tag":"Category", "cdr_field_id": "category", "type": "cdrfield", "value": "category"}, - {"tag":"Subject", "cdr_field_id": "account", "type": "cdrfield", "value": "account"}, - {"tag":"Destination", "cdr_field_id": "destination", "type": "cdrfield", "value": "~destination:s/^1(\\d+)/+$1/:s/^\\+(\\d+)/00$1/"}, - {"tag":"AnswerTime", "cdr_field_id": "answer_time", "type": "cdrfield", "value": "answer_time", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"Usage", "cdr_field_id": "usage", "type": "cdrfield", "value": "usage"}, - {"tag":"Cost", "cdr_field_id": "cost", "type": "cdrfield", "value": "cost"}, + {"tag": "CgrId", "type": "*composed", "value": "CGRID"}, + {"tag":"AccId", "type": "*composed", "value": "OriginID"}, + {"tag":"ReqType", "type": "*composed", "value": "RequestType"}, + {"tag":"Tenant", "type": "*composed", "value": "Tenant"}, + {"tag":"Category", "type": "*composed", "value": "Category"}, + {"tag":"Subject", "type": "*composed", "value": "Account"}, + {"tag":"Destination", "type": "*composed", "value": "~Destination:s/^1(\\d+)/+$1/:s/^\\+(\\d+)/00$1/"}, + {"tag":"AnswerTime", "type": "*datetime", "value": "AnswerTIme", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag":"Usage", "type": "*composed", "value": "Usage"}, + {"tag":"Cost", "type": "*composed", "value": "Cost"}, ], "trailer_fields": [], }, diff --git a/data/tutorials/kamevapi/cgrates/etc/cgrates/cgrates.json b/data/tutorials/kamevapi/cgrates/etc/cgrates/cgrates.json index 3a3764e9c..fd0b40bef 100644 --- a/data/tutorials/kamevapi/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorials/kamevapi/cgrates/etc/cgrates/cgrates.json @@ -60,21 +60,21 @@ "export_dir": "/tmp/cgr_kamevapi/cgrates/cdre", "header_fields": [], "content_fields": [ - {"tag": "CgrId", "cdr_field_id": "cgrid", "type": "cdrfield", "value": "cgrid"}, - {"tag":"RunId", "cdr_field_id": "mediation_runid", "type": "cdrfield", "value": "mediation_runid"}, - {"tag":"Tor", "cdr_field_id": "tor", "type": "cdrfield", "value": "tor"}, - {"tag":"AccId", "cdr_field_id": "accid", "type": "cdrfield", "value": "accid"}, - {"tag":"ReqType", "cdr_field_id": "reqtype", "type": "cdrfield", "value": "reqtype"}, - {"tag":"Direction", "cdr_field_id": "direction", "type": "cdrfield", "value": "direction"}, - {"tag":"Tenant", "cdr_field_id": "tenant", "type": "cdrfield", "value": "tenant"}, - {"tag":"Category", "cdr_field_id": "category", "type": "cdrfield", "value": "category"}, - {"tag":"Account", "cdr_field_id": "account", "type": "cdrfield", "value": "account"}, - {"tag":"Subject", "cdr_field_id": "subject", "type": "cdrfield", "value": "subject"}, - {"tag":"Destination", "cdr_field_id": "destination", "type": "cdrfield", "value": "destination"}, - {"tag":"SetupTime", "cdr_field_id": "setup_time", "type": "cdrfield", "value": "setup_time", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"AnswerTime", "cdr_field_id": "answer_time", "type": "cdrfield", "value": "answer_time", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"Usage", "cdr_field_id": "usage", "type": "cdrfield", "value": "usage"}, - {"tag":"Cost", "cdr_field_id": "cost", "type": "cdrfield", "value": "cost"}, + {"tag": "CgrId", "type": "*composed", "value": "CGRID"}, + {"tag":"RunId", "type": "*composed", "value": "RunID"}, + {"tag":"Tor", "type": "*composed", "value": "ToR"}, + {"tag":"AccId", "type": "*composed", "value": "OriginID"}, + {"tag":"ReqType", "type": "*composed", "value": "RequestType"}, + {"tag":"Direction", "type": "*composed", "value": "Direction"}, + {"tag":"Tenant", "type": "*composed", "value": "Tenant"}, + {"tag":"Category", "type": "*composed", "value": "Category"}, + {"tag":"Account", "type": "*composed", "value": "Account"}, + {"tag":"Subject", "type": "*composed", "value": "Subject"}, + {"tag":"Destination", "type": "*composed", "value": "Destination"}, + {"tag":"SetupTime", "type": "*datetime", "value": "SetupTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag":"AnswerTime", "type": "*datetime", "value": "AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag":"Usage", "type": "*composed", "value": "usage"}, + {"tag":"Cost", "type": "*composed", "value": "cost"}, ], "trailer_fields": [], }, @@ -92,16 +92,16 @@ "export_dir": "/tmp/cgr_kamevapi/cgrates/cdre", "header_fields": [], "content_fields": [ - {"tag": "CgrId", "cdr_field_id": "cgrid", "type": "cdrfield", "value": "cgrid"}, - {"tag":"AccId", "cdr_field_id": "accid", "type": "cdrfield", "value": "accid"}, - {"tag":"ReqType", "cdr_field_id": "reqtype", "type": "cdrfield", "value": "reqtype"}, - {"tag":"Tenant", "cdr_field_id": "tenant", "type": "cdrfield", "value": "tenant"}, - {"tag":"Category", "cdr_field_id": "category", "type": "cdrfield", "value": "category"}, - {"tag":"Subject", "cdr_field_id": "account", "type": "cdrfield", "value": "account"}, - {"tag":"Destination", "cdr_field_id": "destination", "type": "cdrfield", "value": "~destination:s/^1(\\d+)/+$1/:s/^\\+(\\d+)/00$1/"}, - {"tag":"AnswerTime", "cdr_field_id": "answer_time", "type": "cdrfield", "value": "answer_time", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"Usage", "cdr_field_id": "usage", "type": "cdrfield", "value": "usage"}, - {"tag":"Cost", "cdr_field_id": "cost", "type": "cdrfield", "value": "cost"}, + {"tag": "CgrId", "type": "*composed", "value": "CGRID"}, + {"tag":"AccId", "type": "*composed", "value": "OriginID"}, + {"tag":"ReqType", "type": "*composed", "value": "RequestType"}, + {"tag":"Tenant", "type": "*composed", "value": "Tenant"}, + {"tag":"Category", "type": "*composed", "value": "Category"}, + {"tag":"Subject", "type": "*composed", "value": "Account"}, + {"tag":"Destination", "type": "*composed", "value": "~Destination:s/^1(\\d+)/+$1/:s/^\\+(\\d+)/00$1/"}, + {"tag":"AnswerTime", "type": "*datetime", "value": "AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag":"Usage", "type": "*composed", "value": "Usage"}, + {"tag":"Cost", "type": "*composed", "value": "Cost"}, ], "trailer_fields": [], } diff --git a/data/tutorials/osips_async/cgrates/etc/cgrates/cgrates.json b/data/tutorials/osips_async/cgrates/etc/cgrates/cgrates.json index 225830f24..62c8b9518 100644 --- a/data/tutorials/osips_async/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorials/osips_async/cgrates/etc/cgrates/cgrates.json @@ -60,21 +60,21 @@ "export_dir": "/tmp/cgr_osipsasync/cgrates/cdre", // path where the exported CDRs will be placed "header_fields": [], // template of the exported header fields "content_fields": [ // template of the exported content fields - {"tag": "CgrId", "cdr_field_id": "cgrid", "type": "cdrfield", "value": "cgrid"}, - {"tag":"RunId", "cdr_field_id": "mediation_runid", "type": "cdrfield", "value": "mediation_runid"}, - {"tag":"Tor", "cdr_field_id": "tor", "type": "cdrfield", "value": "tor"}, - {"tag":"AccId", "cdr_field_id": "accid", "type": "cdrfield", "value": "accid"}, - {"tag":"ReqType", "cdr_field_id": "reqtype", "type": "cdrfield", "value": "reqtype"}, - {"tag":"Direction", "cdr_field_id": "direction", "type": "cdrfield", "value": "direction"}, - {"tag":"Tenant", "cdr_field_id": "tenant", "type": "cdrfield", "value": "tenant"}, - {"tag":"Category", "cdr_field_id": "category", "type": "cdrfield", "value": "category"}, - {"tag":"Account", "cdr_field_id": "account", "type": "cdrfield", "value": "account"}, - {"tag":"Subject", "cdr_field_id": "subject", "type": "cdrfield", "value": "subject"}, - {"tag":"Destination", "cdr_field_id": "destination", "type": "cdrfield", "value": "destination"}, - {"tag":"SetupTime", "cdr_field_id": "setup_time", "type": "cdrfield", "value": "setup_time", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"AnswerTime", "cdr_field_id": "answer_time", "type": "cdrfield", "value": "answer_time", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"Usage", "cdr_field_id": "usage", "type": "cdrfield", "value": "usage"}, - {"tag":"Cost", "cdr_field_id": "cost", "type": "cdrfield", "value": "cost"}, + {"tag": "CgrId", "type": "*composed", "value": "CGRID"}, + {"tag":"RunId", "type": "*composed", "value": "RunID"}, + {"tag":"Tor", "type": "*composed", "value": "ToR"}, + {"tag":"AccId", "type": "*composed", "value": "OriginID"}, + {"tag":"ReqType", "type": "*composed", "value": "RequestType"}, + {"tag":"Direction", "type": "*composed", "value": "Direction"}, + {"tag":"Tenant", "type": "*composed", "value": "Tenant"}, + {"tag":"Category", "type": "*composed", "value": "Category"}, + {"tag":"Account", "type": "*composed", "value": "Account"}, + {"tag":"Subject", "type": "*composed", "value": "Subject"}, + {"tag":"Destination", "type": "*composed", "value": "Destination"}, + {"tag":"SetupTime", "type": "*datetime", "value": "SetupTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag":"AnswerTime", "type": "*datetime", "value": "AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag":"Usage", "type": "*composed", "value": "Usage"}, + {"tag":"Cost", "type": "*composed", "value": "Cost"}, ], "trailer_fields": [], // template of the exported trailer fields }, @@ -89,19 +89,19 @@ "cost_shift_digits": 0, // shift digits in the cost on export (eg: convert from EUR to cents) "mask_destination_id": "MASKED_DESTINATIONS", // destination id containing called addresses to be masked on export "mask_length": 0, // length of the destination suffix to be masked - "export_dir": "/tmp/cgr_osipsasync/cgrates/cdre", // path where the exported CDRs will be placed + "export_directory": "/tmp/cgr_osipsasync/cgrates/cdre", // path where the exported CDRs will be placed "header_fields": [], // template of the exported header fields "content_fields": [ // template of the exported content fields - {"tag": "CgrId", "cdr_field_id": "cgrid", "type": "cdrfield", "value": "cgrid"}, - {"tag":"AccId", "cdr_field_id": "accid", "type": "cdrfield", "value": "accid"}, - {"tag":"ReqType", "cdr_field_id": "reqtype", "type": "cdrfield", "value": "reqtype"}, - {"tag":"Tenant", "cdr_field_id": "tenant", "type": "cdrfield", "value": "tenant"}, - {"tag":"Category", "cdr_field_id": "category", "type": "cdrfield", "value": "category"}, - {"tag":"Subject", "cdr_field_id": "account", "type": "cdrfield", "value": "account"}, - {"tag":"Destination", "cdr_field_id": "destination", "type": "cdrfield", "value": "~destination:s/^1(\\d+)/+$1/:s/^\\+(\\d+)/00$1/"}, - {"tag":"AnswerTime", "cdr_field_id": "answer_time", "type": "cdrfield", "value": "answer_time", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"Usage", "cdr_field_id": "usage", "type": "cdrfield", "value": "usage"}, - {"tag":"Cost", "cdr_field_id": "cost", "type": "cdrfield", "value": "cost"}, + {"tag": "CgrId", "type": "*composed", "value": "CGRID"}, + {"tag":"AccId", "type": "*composed", "value": "OriginID"}, + {"tag":"ReqType", "type": "*composed", "value": "RequestType"}, + {"tag":"Tenant", "type": "*composed", "value": "Tenant"}, + {"tag":"Category", "type": "*composed", "value": "Category"}, + {"tag":"Subject", "type": "*composed", "value": "Account"}, + {"tag":"Destination", "type": "*datetime", "value": "~Destination:s/^1(\\d+)/+$1/:s/^\\+(\\d+)/00$1/"}, + {"tag":"AnswerTime", "type": "*datetime", "value": "AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"}, + {"tag":"Usage", "type": "*composed", "value": "Usage"}, + {"tag":"Cost", "type": "*composed", "value": "Cost"}, ], "trailer_fields": [], }, diff --git a/engine/cdr.go b/engine/cdr.go index 13f27a235..ea3178b31 100644 --- a/engine/cdr.go +++ b/engine/cdr.go @@ -767,6 +767,7 @@ func (cdr *CDR) AsExportRecord(exportFields []*config.CfgCdrField, costShiftDigi var err error expRecord := make([]string, len(exportFields)) for idx, cfgFld := range exportFields { + utils.Logger.Debug(fmt.Sprintf("CDR with export field: %+v", cfgFld)) layout := cfgFld.Layout if len(layout) == 0 { layout = time.RFC3339 @@ -807,6 +808,7 @@ func (cdr *CDR) AsExportRecord(exportFields []*config.CfgCdrField, costShiftDigi outVal, err = cdr.combimedCdrFieldVal(cfgFld, groupedCDRs) case utils.META_COMPOSED: outVal, err = cdr.exportFieldValue(cfgFld, costShiftDigits, roundDecimals, layout, maskLen, maskDestID) + utils.Logger.Debug(fmt.Sprintf("CDR: %+v, outVal: %+v, err: %+v", cdr, outVal, err)) case utils.MetaMaskedDestination: if len(maskDestID) != 0 && CachedDestHasPrefix(maskDestID, cdr.Destination) { outVal = "1" diff --git a/utils/apitpdata.go b/utils/apitpdata.go index 7f572918a..7ee5e75b6 100644 --- a/utils/apitpdata.go +++ b/utils/apitpdata.go @@ -1093,7 +1093,7 @@ type AttrExportCdrsToFile struct { CdrFormat *string // Cdr output file format FieldSeparator *string // Separator used between fields ExportID *string // Optional exportid - ExportFolder *string // If provided it overwrites the configured export directory + ExportDirectory *string // If provided it overwrites the configured export directory ExportFileName *string // If provided the output filename will be set to this ExportTemplate *string // Exported fields template <""|fld1,fld2|*xml:instance_name> DataUsageMultiplyFactor *float64 // Multiply data usage before export (eg: convert from KBytes to Bytes)