Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/tracing / src / dev.ts
Size: Mime:
import express from 'express'
import bodyParser from 'body-parser'
import cors from 'cors'
import { oneStorage } from '@skava/persistence'
import { LoggingMetaType } from './typings'

const app = express()
const corsOptions = {
  origin: true,
  credentials: true,
  methods: ['GET', 'POST', 'OPTIONS'],
}
app.use(
  cors(corsOptions)
)
app.use(
  bodyParser.json()
)
app.use(
  bodyParser.urlencoded({
    extended: true,
  })
)

const logs: LoggingMetaType[] = oneStorage.get('logs-dev') || []


export type GroupedLogItemType = { [key: string]: LoggingMetaType[] }

function fromLogsToGrouped(logList: LoggingMetaType[]) {
  const grouped: GroupedLogItemType = {}

  logList.forEach(item => {
    const id = item.tracing.openTraceId
    if (grouped[id] === undefined) {
      grouped[id] = []
    }
    grouped[id].push(item)
  })

  return grouped
}

app.get('/', (req, res) => {
  const grouped = fromLogsToGrouped(logs)
  let html = `<ul>`

  console.log(grouped)

  Object.keys(grouped).forEach(key => {
    html += `
      <li>
        <header>
          <em>traceId: ${key}</em>
          <br />
          <small>sessionId: ${grouped[key][0].tracing.sessionId}</small>
        </header>
        <ol>
          ${grouped[key].filter(Boolean).reverse().map(item => `
            <li>
              <p>${item.meta.appName || 'no app name'}</p>
              <p>span: ${item.tracing.openTraceSpanId} ${item.meta.spanName || ''}</p>

              ${
                typeof item.timing === 'string'
                  ? `<span>${item.timing}</span>`
                  : `
                    <span>
                      <span title="in nanoseconds">duration: </span>
                      <time
                        datetime="${item.timing.startTime}"
                        title="${item.timing.startTime}"
                      >${item.timing.durationInNanoSeconds}</time>
                    </span>`
              }

              ${(item.meta.bytesReceived || item.meta.bytesSent) ? `<p>bytes: ${item.meta.bytesReceived} => ${item.meta.bytesSent}</p>` : '<p>no byte size 🔎</p>'}

              <span>${item.cache.isCached ? '💸' : '🚫💰'}</span>
              ${item.cache.type ? `<p>cache type: ${item.cache.type}</p>` : ''}
            </li>
          `).join('\n')}
        </ol>
      </li>
    `
  })
  html += '</ul>'

  res.send(html)

  // const logResponse = logs.map(log => JSON.stringify(log, undefined, 2)).join('<br />')
  // res.send(logResponse)
})

// @todo
app.get('/:trace-id', (req, res) => {
  res.send('todo - support trace id')
})
app.get('*', (req, res) => {
  res.send({
    spanId: req.get('x-b3-spanid'),
  })
})


app.post('/trace', (req, res) => {
  console.log({
    body: req.body,
    url: req.url,
    headers: req.headers
  })

  logs.push(req.body)
  oneStorage.set('logs-dev', logs)
  res.end()
})



app.listen(7777, () => console.log('@skava/tracing listening on http://localhost:7777'))