Skip to content

Commit 63aa1d2

Browse files
author
jianggang
authored
Merge pull request #14 from FeatureProbe/metric_feature
feat: Add variation history for metric
2 parents 427aedc + 0b5d75a commit 63aa1d2

20 files changed

Lines changed: 330 additions & 63 deletions
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.featureprobe.api.base.constants;
2+
3+
public enum MetricType {
4+
5+
VALUE, NAME;
6+
7+
8+
public boolean isNameType() {
9+
return this == MetricType.NAME;
10+
11+
}
12+
}

src/main/java/com/featureprobe/api/controller/MetricController.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.featureprobe.api.controller;
22

3+
import com.featureprobe.api.base.constants.MetricType;
34
import com.featureprobe.api.base.doc.DefaultApiResponses;
45
import com.featureprobe.api.base.doc.EnvironmentKeyParameter;
56
import com.featureprobe.api.base.doc.GetApiResponse;
@@ -38,8 +39,9 @@ public class MetricController {
3839
public MetricResponse query(@PathVariable("projectKey") String projectKey,
3940
@PathVariable("environmentKey") String environmentKey,
4041
@PathVariable("toggleKey") String toggleKey,
42+
@RequestParam(value = "metricType", defaultValue = "VALUE") MetricType metricType,
4143
@RequestParam(value = "lastHours", defaultValue = "24") int lastHours) {
4244

43-
return metricService.query(projectKey, environmentKey, toggleKey, lastHours);
45+
return metricService.query(projectKey, environmentKey, toggleKey, metricType, lastHours);
4446
}
4547
}

src/main/java/com/featureprobe/api/entity/Event.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,17 @@ public class Event implements Serializable {
4444
@Column(name = "toggle_key")
4545
private String toggleKey;
4646

47-
private String variation;
47+
@Column(name = "environment_key")
48+
private String environmentKey;
49+
50+
@Column(name = "project_key")
51+
private String projectKey;
52+
53+
@Column(name = "toggle_version")
54+
private Long toggleVersion;
55+
56+
@Column(name = "value_index")
57+
private Integer valueIndex;
4858

4959
private Long count;
5060

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.featureprobe.api.entity;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.EqualsAndHashCode;
6+
import lombok.NoArgsConstructor;
7+
import lombok.ToString;
8+
import org.hibernate.annotations.DynamicInsert;
9+
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
10+
11+
import javax.persistence.Column;
12+
import javax.persistence.Entity;
13+
import javax.persistence.EntityListeners;
14+
import javax.persistence.GeneratedValue;
15+
import javax.persistence.GenerationType;
16+
import javax.persistence.Id;
17+
import javax.persistence.Table;
18+
import java.io.Serializable;
19+
20+
@EqualsAndHashCode
21+
@NoArgsConstructor
22+
@AllArgsConstructor
23+
@Data
24+
@Entity
25+
@Table(name = "variation_history")
26+
@DynamicInsert
27+
@ToString(callSuper = true)
28+
@EntityListeners(AuditingEntityListener.class)
29+
public class VariationHistory implements Serializable {
30+
31+
@Id
32+
@GeneratedValue(strategy = GenerationType.IDENTITY)
33+
private Long id;
34+
35+
@Column(name = "toggle_key")
36+
private String toggleKey;
37+
38+
@Column(name = "environment_key")
39+
private String environmentKey;
40+
41+
@Column(name = "project_key")
42+
private String projectKey;
43+
44+
@Column(name = "toggle_version")
45+
private Long toggleVersion;
46+
47+
private String value;
48+
49+
@Column(name = "value_index")
50+
private Integer valueIndex;
51+
52+
private String name;
53+
54+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package com.featureprobe.api.model;
22

33
import lombok.Data;
4+
import org.apache.commons.collections4.CollectionUtils;
45

56
import java.util.List;
67

78
@Data
89
public class BaseRule {
910

1011
private List<ConditionValue> conditions;
12+
13+
public boolean isNotEmptyConditions() {
14+
return CollectionUtils.isNotEmpty(conditions);
15+
}
1116
}

src/main/java/com/featureprobe/api/model/ConditionValue.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,8 @@ public Condition toCondition() {
2626
condition.setObjects(objects);
2727
return condition;
2828
}
29+
30+
public boolean isSegmentType() {
31+
return StringUtils.equals(ConditionType.SEGMENT.toValue(), getType());
32+
}
2933
}

src/main/java/com/featureprobe/api/model/VariationAccessCounter.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,18 @@ public class VariationAccessCounter {
1717

1818
@NotNull
1919
private Long count;
20+
21+
@NotNull
22+
private Long version;
23+
24+
@NotNull
25+
private Integer index;
26+
27+
28+
public VariationAccessCounter(String value, Long count) {
29+
this.value = value;
30+
this.count = count;
31+
}
32+
33+
2034
}

src/main/java/com/featureprobe/api/repository/EnvironmentRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public interface EnvironmentRepository extends JpaRepository<Environment, Long>
1515

1616
List<Environment> findAllByProjectKey(String projectKey);
1717

18-
Environment findByServerSdkKey(String serverSdkKey);
18+
Optional<Environment> findByServerSdkKey(String serverSdkKey);
1919

2020
Optional<Environment> findByServerSdkKeyOrClientSdkKey(String serverSdkKey, String clientSdkKey);
2121

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.featureprobe.api.repository;
2+
3+
import com.featureprobe.api.entity.VariationHistory;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
6+
import org.springframework.stereotype.Repository;
7+
8+
import java.util.List;
9+
10+
@Repository
11+
public interface VariationHistoryRepository extends JpaRepository<VariationHistory, Long>,
12+
JpaSpecificationExecutor<VariationHistory> {
13+
14+
15+
List<VariationHistory> findByProjectKeyAndEnvironmentKeyAndToggleKey(String projectKey,
16+
String environmentKey, String toggleKey);
17+
}

src/main/java/com/featureprobe/api/service/EventService.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.featureprobe.api.service;
22

33

4+
import com.featureprobe.api.base.enums.ResourceType;
5+
import com.featureprobe.api.base.exception.ResourceNotFoundException;
46
import com.featureprobe.api.dto.EventCreateRequest;
7+
import com.featureprobe.api.entity.Environment;
58
import com.featureprobe.api.entity.Event;
69
import com.featureprobe.api.model.VariationAccessCounter;
10+
import com.featureprobe.api.repository.EnvironmentRepository;
711
import com.featureprobe.api.repository.EventRepository;
812
import lombok.AllArgsConstructor;
913
import lombok.extern.slf4j.Slf4j;
@@ -22,8 +26,12 @@
2226
public class EventService {
2327

2428
private EventRepository eventRepository;
29+
private EnvironmentRepository environmentRepository;
2530

2631
public void create(String serverSdkKey, List<EventCreateRequest> requests) {
32+
Environment environment = environmentRepository.findByServerSdkKey(serverSdkKey)
33+
.orElseThrow(() -> new ResourceNotFoundException(ResourceType.ENVIRONMENT, serverSdkKey));
34+
2735
requests.forEach(request -> {
2836
if (request.getAccess() == null) {
2937
return;
@@ -33,7 +41,7 @@ public void create(String serverSdkKey, List<EventCreateRequest> requests) {
3341
.entrySet()
3442
.stream()
3543
.flatMap(entry -> createEventEntities(entry).stream())
36-
.map(event -> wrapEvent(event, serverSdkKey, request))
44+
.map(event -> wrapEvent(event, environment, request))
3745
.collect(Collectors.toList());
3846

3947
if (!events.isEmpty()) {
@@ -57,16 +65,19 @@ private Event createEventEntity(String toggleKey, VariationAccessCounter accessC
5765
Event event = new Event();
5866
event.setToggleKey(toggleKey);
5967
event.setCount(accessCounter.getCount());
60-
event.setVariation(accessCounter.getValue());
68+
event.setValueIndex(accessCounter.getIndex());
69+
event.setToggleVersion(accessCounter.getVersion());
6170

6271
return event;
6372
}
6473

65-
private Event wrapEvent(Event event, String serverSdkKey, EventCreateRequest request) {
74+
private Event wrapEvent(Event event, Environment environment, EventCreateRequest request) {
6675
if (request.getAccess() == null) {
6776
return event;
6877
}
69-
event.setSdkKey(serverSdkKey);
78+
event.setSdkKey(environment.getServerSdkKey());
79+
event.setProjectKey(environment.getProject().getKey());
80+
event.setEnvironmentKey(environment.getKey());
7081
event.setType("access");
7182
event.setStartDate(new Date(request.getAccess().getStartTime()));
7283
event.setEndDate(new Date(request.getAccess().getEndTime()));

0 commit comments

Comments
 (0)