in exporter/collector/logs.go [285:350]
func (l logMapper) createEntries(ld plog.Logs) (map[string][]*logpb.LogEntry, error) {
// if destination_project_quota is enabled, projectMapKey will be the name of the project for each batch of entries
// otherwise, we can mix project entries for more efficient batching and store all entries in a single list
projectMapKey := ""
var errs []error
entries := make(map[string][]*logpb.LogEntry)
for i := 0; i < ld.ResourceLogs().Len(); i++ {
rl := ld.ResourceLogs().At(i)
mr := l.cfg.LogConfig.MapMonitoredResource(rl.Resource())
extraResourceLabels := attributesToUnsanitizedLabels(filterAttributes(rl.Resource().Attributes(), l.cfg.LogConfig.ServiceResourceLabels, l.cfg.LogConfig.ResourceFilters))
projectID := l.cfg.ProjectID
// override project ID with gcp.project.id, if present
if projectFromResource, found := rl.Resource().Attributes().Get(resourcemapping.ProjectIDAttributeKey); found {
projectID = projectFromResource.AsString()
}
for j := 0; j < rl.ScopeLogs().Len(); j++ {
sl := rl.ScopeLogs().At(j)
logLabels := mergeLogLabels(sl.Scope().Name(), sl.Scope().Version(), extraResourceLabels)
for k := 0; k < sl.LogRecords().Len(); k++ {
// make a copy of logLabels so that shared attributes (scope/resource) are copied across LogRecords,
// but that individual LogRecord attributes don't copy over to other Records via map reference.
entryLabels := make(map[string]string)
for k, v := range logLabels {
entryLabels[k] = v
}
log := sl.LogRecords().At(k)
// We can't just set logName on these entries otherwise the conversion to internal will fail
// We also need the logName here to be able to accurately calculate the overhead of entry
// metadata in case the payload needs to be split between multiple entries.
logName, err := l.getLogName(log)
if err != nil {
errs = append(errs, err)
continue
}
splitEntries, err := l.logToSplitEntries(
log,
mr,
entryLabels,
time.Now(),
logName,
projectID,
)
if err != nil {
errs = append(errs, err)
continue
}
for _, entry := range splitEntries {
if l.cfg.DestinationProjectQuota {
projectMapKey = projectID
}
if _, ok := entries[projectMapKey]; !ok {
entries[projectMapKey] = make([]*logpb.LogEntry, 0)
}
entries[projectMapKey] = append(entries[projectMapKey], entry)
}
}
}
}
return entries, errors.Join(errs...)
}