Count on a scalable system, built by experts

Our platform was designed by veterans of Netflix, Twitter and Microsoft. It incorporates the latest technology, including Cassandra, Spark, React, Containers and Amazon Web Services.

Get going in minutes

We offer developers the same suite of tools our team uses so they can accelerate the creation of their own apps.

Processing in the Real-time Stream

Data stream apps make it seamless and easy to run code within the real-time data stream. Run Java, C#, Python, Javascript and more without worrying about the myriad of infrastructure standing underneath. This example shows the power and strength of calculating the real-time bit efficiency known as 'Mechanical Specific Energy (MSE)'. We process the record data and save the result to a 'collection' of our choosing. Any visualization apps subscribing to this collection will get automatic updates pushed in real-time.

var corva_worker = require('corva-worker-js');

// Corva API wrapper
var corva = new corva_worker();

// Process each WITSML record
function processor(callback) {
  let self = this;

    self.records.forEach(function(record) {

      bit_diameter = record.drillstring.bit.size;

      // Mechanical Specific Energy (MSE) calculation
      var mse = (480 * record.rotary_torque * record.rotary_rpm) / (Math.pow(bit_diameter, 2) * record.rop) + (4 * record.weight_on_bit) / ((Math.pow(bit_diameter, 2) * Math.PI)

      corva.save_data({
        data: {
          measured_depth: record.hole_depth,
          mse: mse,
        },
        collection: "drilling-efficiency.mse-example",
        asset_id: record.asset_id
      });
    }
  }

  // External platform event handler
  exports.handler = function (event, context) {
  'use strict';

  corva.process(event, processor, function(error) {
    if (error) {
      context.fail(error);
    } else {
      context.succeed('success');
    }
  });
};

Building apps with the Corva REST API is simple and powerful. Here is an example CURL command line request to query the values of Hole Depth, Weight on Bit, RPM, and ROP when the hole depth is greater than 7,000ft, the weight on bit is greater than 45 klbf, and the RPM is greater than 70. We have sorted by time and limited to 2 return values.

Example Request

curl http://api.qa.corva.ai/v1/data/corva/wits \
   -H "Authorization: API api-key" \
   -H "X-Corva-App: App Name" \
   -d asset_id=14 \
   -d fields=data.hole_depth,data.weight_on_bit,data.rotary_rpm,data.rop \
   -d query={data.hole_depth#gt#7000}AND{data.weight_on_bit#gt#45}AND{data.rotary_rpm#gt#70} \
   -d limit=2 \
   -d sort={timestamp:-1}

Example Response

[
  {
    "_id": "59030f18af2bc36b336bfcc5",
    "data": {
      "hole_depth": 7840,
      "rop": 42.943529,
      "rotary_rpm": 71,
      "weight_on_bit": 46.8
    }
  },
  {
    "_id": "59030f0eaf2bc36b336bfc44",
    "data": {
      "hole_depth": 7840,
      "rop": 58.686525,
      "rotary_rpm": 71,
      "weight_on_bit": 45.8
    }
  }
]

Visualization apps are built using widely adopted HTML5, CSS3, and Javascript technologies. Specifically we encourage the use of React, but any flavor will work. This example shows the power of leveraging a few of our UI library components such as the 'Gauge' and 'Chart' in order to build a simple yet powerful UI app. We render the gauges for Torque & Drag weight transfer and drillstring drag using a stoplight paradigm (red, yellow, green). Then, we render a graph showing the drag trend for the last 24 hours.

render() {
  return (
    <div className="c-tnd-overview">
      <div>
      <Row>
        <Col s={6}>
          <h4>Weight Transfer</h4>
          <Gauge widthCols={this.props.widthCols}
                    bands={this.getGaugeBands()}
                    value={this.getWeightTransferGaugeValue()} />
        </Col>
        <Col s={6}>
          <h4>Drag</h4>
          <Gauge widthCols={this.props.widthCols}
                    bands={this.getGaugeBands()}
                    value={this.getDragGaugeValue()} />
        </Col>
      </Row>
      <Row>
        <Col s={12}>
          <h4>Drag Trend</h4>
          <Chart horizontal={true}
                    chartType="column"
                    xField="time"
                    size={this.props.size}
                    widthCols={this.props.widthCols}
                    hideXAxis={true}> {this.getSeries().map(({field, maxValue, data}, idx) => (
                      <ChartSeries key={field}
                                      id={field}
                                      title={CHART_SERIES[field].label}
                                      data={data}
                                      yField="value"
                                      type="column" />
                    ))} </Chart>
        </Col>
      </Row>
      <Row>
        <Col s={6}>
        24 hours ago
        </Col>
        <Col s={6}>
        Now
        </Col>
      </Row>
    </div>
  </div>
  );
}

Execution happens in docker containers with no programming language restrictions. Visualizations leverage modern HTML and Javascript.