Skip to content

Instantly share code, notes, and snippets.

View mseemann's full-sized avatar
🌴
On vacation

Michael Seemann mseemann

🌴
On vacation
View GitHub Profile
@mseemann
mseemann / SampleContract.sol
Created January 6, 2022 15:45
SampleContract
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
contract SampleContract {
uint storedData;
function set(uint x) public {
storedData = x;
}
@mseemann
mseemann / process_lag.promql
Created September 4, 2021 10:34
process_lag.promql
max_over_time(sync_last_processed_doc_at[24h]) - max_over_time(sync_last_seen_doc_at[24h])
@mseemann
mseemann / promql
Created September 4, 2021 10:32
sync lag
max_over_time(sync_last_seen_oplog_at[24h]) - ignoring(instance, job) max_over_time(sync_last_seen_doc_at[24h])
@mseemann
mseemann / UserCollectionChangeStreamService.java
Created September 3, 2021 15:23
UserCollectionChangeStreamService
Gauge.builder("sync.last.seen.doc.at", this, listener -> listener.lastSeenAt.get())
.strongReference(true)
.register(Metrics.globalRegistry);
Gauge.builder("sync.last.processed.doc.at", this, listener -> listener.lastProcessedAt.get())
.strongReference(true)
.register(Metrics.globalRegistry);
@mseemann
mseemann / MongoStats.java
Created September 3, 2021 15:10
MongoStats -> Prometheus
Gauge.builder("sync.last.seen.oplog.at", this, mongoStats -> mongoStats.lastOplogAt.get())
.strongReference(true)
.register(Metrics.globalRegistry);
@mseemann
mseemann / MongoStats.java
Created September 3, 2021 15:03
MongoStats
Query tailQ = new Query().addCriteria(Criteria.where("ns").is("streams.user"));
reactiveMongoTemplate.tail(tailQ, OplogEntry.class, "oplog.rs")
.retryWhen(Retry.indefinitely().doAfterRetryAsync(signal -> Mono.delay(Duration.ofSeconds(10)).then()))
.subscribe(entry -> {
log.info("tailed entry: {}", entry);
lastOplogAt.set(entry.ts().getTime() * 1000L);
});
@mseemann
mseemann / SyncToPostgresService.java
Last active September 4, 2021 16:18
SyncToPostgresService
@Service
@Slf4j
@Transactional(propagation = Propagation.REQUIRED)
@AllArgsConstructor
public class SyncToPostgresService {
UserEntityRepository userEntityRepository;
ResumeTokenRepository resumeTokenRepository;
public void syncInASingleTx(User document, String bookmarkToken, Long tokenTimeStamp) {
@mseemann
mseemann / UserCollectionChangeStreamService.java
Created September 3, 2021 13:52
UserCollectionChangeStreamService
reactiveMongoTemplate
.changeStream(User.class)
.watchCollection("user")
.listen()
.subscribe(event -> {
log.info("change stream event {}", event);
BsonDocument newResumeToken = Objects.requireNonNull(event.getRaw()).getResumeToken().asDocument();
BsonString token = newResumeToken.getString("_data");
var timeStampInMs = Objects.requireNonNull(event.getBsonTimestamp()).getTime() * 1000L;
@mseemann
mseemann / application.yaml
Last active September 3, 2021 11:04
mongo-streams application.yaml
spring:
data:
mongodb:
host: localhost
port: 27017
database: streams
@mseemann
mseemann / UserController.java
Created September 3, 2021 10:30
monog-streams UserController
@RestController
@AllArgsConstructor
public class UserController {
UserRepository userRepository;
@GetMapping("/user")
public Flux<User> getAllUser() {
return userRepository.findAll();