Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,16 @@ public LogEvent createConversionEvent(@Nonnull ProjectConfig projectConfig,

List<LayerState> layerStates = createLayerStates(projectConfig, experimentVariationMap);

Long eventValue = EventTagUtils.getRevenueValue(eventTags);
List<EventMetric> eventMetrics = Collections.emptyList();
if (eventValue != null) {
eventMetrics = Collections.singletonList(new EventMetric(EventMetric.REVENUE_METRIC_TYPE, eventValue));
List<EventMetric> eventMetrics = new ArrayList<EventMetric>();

Long revenueValue = EventTagUtils.getRevenueValue(eventTags);
if (revenueValue != null) {
eventMetrics.add(new EventMetric(EventMetric.REVENUE_METRIC_TYPE, revenueValue));
}

Double numericMetricValue = EventTagUtils.getNumericValue(eventTags);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vraja2 can there only be one numeric metric value?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, it will correspond to the event being tracked.

if (numericMetricValue != null) {
eventMetrics.add(new EventMetric(EventMetric.NUMERIC_METRIC_TYPE, numericMetricValue));
}

Conversion conversionPayload = new Conversion();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,14 @@
public class EventMetric {

public static final String REVENUE_METRIC_TYPE = "revenue";
public static final String NUMERIC_METRIC_TYPE = "value";

private String name;
private long value;
private Number value;

public EventMetric() { }

public EventMetric(String name, long value) {
public EventMetric(String name, Number value) {
this.name = name;
this.value = value;
}
Expand All @@ -38,30 +39,29 @@ public void setName(String name) {
this.name = name;
}

public long getValue() {
public Number getValue() {
return value;
}

public void setValue(long value) {
public void setValue(Number value) {
this.value = value;
}


@Override
public boolean equals(Object other) {
if (!(other instanceof EventMetric))
return false;
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;

EventMetric otherEventMetric = (EventMetric)other;
EventMetric that = (EventMetric) obj;

return name.equals(otherEventMetric.getName()) && value == otherEventMetric.getValue();
if (!name.equals(that.name)) return false;
return value.equals(that.value);
}


@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (int) (value ^ (value >>> 32));
int result = name.hashCode();
result = 31 * result + value.hashCode();
return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,22 @@ public static Long getRevenueValue(@Nonnull Map<String, ?> eventTags) {
}
return eventValue;
}

/**
* Fetch the numeric metric value from event tags. "value" is a reserved keyword.
*/
public static Double getNumericValue(@Nonnull Map<String, ?> eventTags) {
Double eventValue = null;
if (eventTags.containsKey(ReservedEventKey.VALUE.toString())) {
Object rawValue = eventTags.get(ReservedEventKey.VALUE.toString());
if (rawValue instanceof Number) {
eventValue = ((Number) rawValue).doubleValue();
logger.info("Parsed numeric metric value \"{}\" from event tags.", eventValue);
} else {
logger.warn("Failed to parse numeric metric value \"{}\" from event tags.", rawValue);
}
}

return eventValue;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
package com.optimizely.ab.internal;

public enum ReservedEventKey {
REVENUE("revenue");
REVENUE("revenue"),
VALUE("value");

private final String key;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.optimizely.ab.event.internal;

import com.google.gson.Gson;
import com.google.gson.internal.LazilyParsedNumber;
import com.optimizely.ab.bucketing.Bucketer;
import com.optimizely.ab.bucketing.DecisionService;
import com.optimizely.ab.bucketing.UserProfileService;
Expand Down Expand Up @@ -314,11 +315,13 @@ public void createConversionEvent() throws Exception {
}

/**
* Verify that eventValue is properly recorded in a conversion request as an {@link EventMetric}
* Verify that "revenue" and "value" are properly recorded in a conversion request as {@link EventMetric} objects.
* "revenue" is fixed-point and "value" is floating-point.
*/
@Test
public void createConversionParamsWithRevenue() throws Exception {
long revenue = 1234L;
public void createConversionParamsWithEventMetrics() throws Exception {
Long revenue = 1234L;
Double value = 13.37;

// use the "valid" project config and its associated experiment, variation, and attributes
Attribute attribute = validProjectConfig.getAttributes().get(0);
Expand All @@ -341,6 +344,7 @@ public void createConversionParamsWithRevenue() throws Exception {
Map<String, String> attributeMap = Collections.singletonMap(attribute.getKey(), "value");
Map<String, Object> eventTagMap = new HashMap<String, Object>();
eventTagMap.put(ReservedEventKey.REVENUE.toString(), revenue);
eventTagMap.put(ReservedEventKey.VALUE.toString(), value);
Map<Experiment, Variation> experimentVariationMap = createExperimentVariationMap(
validProjectConfig,
decisionService,
Expand All @@ -352,10 +356,11 @@ public void createConversionParamsWithRevenue() throws Exception {
eventTagMap);

Conversion conversion = gson.fromJson(conversionEvent.getBody(), Conversion.class);

// we're not going to verify everything, only revenue
assertThat(conversion.getEventMetrics(),
is(Collections.singletonList(new EventMetric(EventMetric.REVENUE_METRIC_TYPE, revenue))));
List<EventMetric> eventMetrics = Arrays.asList(
new EventMetric(EventMetric.REVENUE_METRIC_TYPE, new LazilyParsedNumber(revenue.toString())),
new EventMetric(EventMetric.NUMERIC_METRIC_TYPE, new LazilyParsedNumber(value.toString())));
// we're not going to verify everything, only the event metrics
assertThat(conversion.getEventMetrics(), is(eventMetrics));
}

/**
Expand Down